MODELO PREDICTIVO DEL COVID - 19 EN COLOMBIA

Integrantes:

Analítica Predictiva

Medellín

2020

Introducción

La COVID‑19 es una enfermedad infecciosa causada por el coronavirus que se ha descubierto más recientemente. Tanto este nuevo virus como la enfermedad que provoca eran desconocidos antes de que estallara el brote en Wuhan (China) en diciembre de 2019. Actualmente la COVID‑19 es una pandemia que afecta a muchos países de todo el mundo. Esta pandemoa nos ha enseñado que no podemos enfrentar los problemas de igual forma en todos los lugares. En Colombia, desde la llegada del virus en el territorio, se han generado medidas correctivas y preventivas a nivel Nacional y Departamental. A partir de lo anterior, es relevante aplicar tecnicas análiticas que permitan entender el comportamiento del virus y prepararnos para minimizar su impacto.

El virus llegó a los distintos departamentos en fechas diferentes y con efectos diversos. Las regiones que registraron la pandemia con más demora son las mismas cuyo contagio se aceleró durante los meses de mayo y junio. Dentro de las capitales el coronavirus ataca donde existe una densidad poblacional alta, hay pobreza, desempleo, informalidad, delincuencia, microtráfico y deficiencias en los servicios públicos. Claramente el virus se concentra en seis regiones del país, con más del 80% de los casos acumulados. Este fraccionamiento hace que tratar de igual forma las distintas regiones sea perjudicial para la salud y la economía del país.

El análisis de predicción alrededor de este tema a nivel Nacional y departamental motiva para mitigar riesgos y actuar en el momento preciso. El presente trabajo se concentra en las principales ciudades (Bogotá D.C, Medellín, Cartagena, Cali y Barranquilla) con mayor cantidad de casos confirmados en Colombia.

Definición del problema real:

A finales de año 2019, en la gran capital de la provincia de Hubei en China denominada Wuhan, empieza un brote de una nueva enfermedad el Coronavirus 2019 (COVID -19), que se convierte en la pandemia a nivel mundial que afecta a un total de 188 países, que corresponde al 97% de los países en el año 2020. Actualmente, el objetivo de todos los científicos del mundo es "Aplanar la curva".

En Colombia, el primer caso positivo de Covid - 19 se presentó el 3 de marzo del 2020 y desde esta fecha su propagación ha aumentado al igual que las medidas preventivas y correctivas. Es por esto que nace la necesidad de pronosticar a corto plazo a nivel departamental el comportamiento de la pandemia con el fin de generar un modelo de predicción para la toma de decisiones con respecto a la expansión del virus.

Definición del problema de analítica

Generar Predicciones y pronósticos de series temporales para estudiar el impacto y la propagación de COVID-19 en el corto plazo para las cinco (5) ciudades principales en Colombia.

Metodologia:

Datos

Los datos del modelo son obtenidos a partir de la página https://www.datos.gov.co/; esta página tiene disponible archivos CSV diarios que tiene información que es actualizada con las cifras del Covid-19 para Colombia. La información es consumida mediante python.

El conjunto de datos presenta 21 atributos dentro de los cuales los más relevantes para realizar el análisis son: Fecha de Notificación, Ciudad de ubicación, Fecha de muerte, Fecha diagnóstico, Fecha recuperado, Fecha reporte Web y tipo de atención. A partir de la información suministrada por la fuente de datos fue necesario disponer de un algortimo que realiza el conteo numérico acumulado por fecha y por ciudad, de tal manera que permita tener en todas las fechas hasta la actualidad los casos acumulados fallecidos, acumulados confirmados, acumulados recuperados y acumulados activos.

Se consideró trabajar con los acumulados porque permite caracterizar el comportamiento de los datos para las diferentes fechas que se requieren analizar. Es importante tener presente que los expertos coinciden en que el dato de diagnósticos o de fallecidos diarios del balance es menos importante que otros indicadores. Fernando Rodríguez Artalejo, epidemiólogo y director de Medicina Preventiva y Salud Pública de la Universidad Autónoma, señala que seguir las cifras día a día, “puede variar mucho”, “tiene un valor relativo y prácticamente no nos dice nada”, señalando que podría tener más sentido realizar análisis con casos diagnosticados en los últimos 7 días por ejemplo, porque son series mas estables y se pueden comparar con comportamiento de semanas anteriores.

Gestión del ciclo de vida del producto de datos.

Metodologias propuestas:

MODELOS.JPG

Los modelos de series de tiempo contempla un conjunto de modelos enfocados en la relación del tiempo fecha/hora.Para el pronóstico del COVID-19 en Colombia y en las principales ciudades, se contemplaron los siguientes modelos Y a partir del Error Cuadrático Medio -MSE - se seleccionó el más ajustado a los datos del validación.

El modelo seleccionado es el modelo ARIMA que a partir de las variaciones de los datos fue el que más se adaptó en las estimaciones futuras con los datos históricos considerando el MSE y el comportamiento del conjunto de validación.

Objetivo

Generar un modelo de predicción con series temporales para estudiar el impacto y la propagación de COVID-19 a corto plazo en las cinco (5) ciudades principales de Colombia.

Despliegue de los resultados

In [1]:
pip install fbprophet
Requirement already satisfied: fbprophet in /usr/local/lib/python3.6/dist-packages (0.6)
Requirement already satisfied: Cython>=0.22 in /usr/local/lib/python3.6/dist-packages (from fbprophet) (0.29.21)
Requirement already satisfied: cmdstanpy==0.4 in /usr/local/lib/python3.6/dist-packages (from fbprophet) (0.4.0)
Requirement already satisfied: pystan>=2.14 in /usr/local/lib/python3.6/dist-packages (from fbprophet) (2.19.1.1)
Requirement already satisfied: numpy>=1.10.0 in /usr/local/lib/python3.6/dist-packages (from fbprophet) (1.18.5)
Requirement already satisfied: pandas>=0.23.4 in /usr/local/lib/python3.6/dist-packages (from fbprophet) (1.0.5)
Requirement already satisfied: matplotlib>=2.0.0 in /usr/local/lib/python3.6/dist-packages (from fbprophet) (3.2.2)
Requirement already satisfied: LunarCalendar>=0.0.9 in /usr/local/lib/python3.6/dist-packages (from fbprophet) (0.0.9)
Requirement already satisfied: convertdate>=2.1.2 in /usr/local/lib/python3.6/dist-packages (from fbprophet) (2.2.1)
Requirement already satisfied: holidays>=0.9.5 in /usr/local/lib/python3.6/dist-packages (from fbprophet) (0.9.12)
Requirement already satisfied: setuptools-git>=1.2 in /usr/local/lib/python3.6/dist-packages (from fbprophet) (1.2)
Requirement already satisfied: python-dateutil>=2.8.0 in /usr/local/lib/python3.6/dist-packages (from fbprophet) (2.8.1)
Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.6/dist-packages (from pandas>=0.23.4->fbprophet) (2018.9)
Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib>=2.0.0->fbprophet) (2.4.7)
Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib>=2.0.0->fbprophet) (1.2.0)
Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.6/dist-packages (from matplotlib>=2.0.0->fbprophet) (0.10.0)
Requirement already satisfied: ephem>=3.7.5.3 in /usr/local/lib/python3.6/dist-packages (from LunarCalendar>=0.0.9->fbprophet) (3.7.7.1)
Requirement already satisfied: pymeeus<=1,>=0.3.6 in /usr/local/lib/python3.6/dist-packages (from convertdate>=2.1.2->fbprophet) (0.3.7)
Requirement already satisfied: six in /usr/local/lib/python3.6/dist-packages (from holidays>=0.9.5->fbprophet) (1.15.0)
In [2]:
pip install pyramid.arima
Collecting pyramid.arima
  Downloading https://files.pythonhosted.org/packages/5c/84/57422f2a6ade3161c586545e38b518ba1b7ab30ee4a4acc29110c0aba2bc/pyramid_arima-0.9.0-cp36-cp36m-manylinux1_x86_64.whl (597kB)
     |████████████████████████████████| 604kB 2.8MB/s 
Requirement already satisfied: scikit-learn>=0.17 in /usr/local/lib/python3.6/dist-packages (from pyramid.arima) (0.22.2.post1)
Requirement already satisfied: numpy>=1.10 in /usr/local/lib/python3.6/dist-packages (from pyramid.arima) (1.18.5)
Requirement already satisfied: statsmodels>=0.9.0 in /usr/local/lib/python3.6/dist-packages (from pyramid.arima) (0.10.2)
Requirement already satisfied: Cython>=0.23 in /usr/local/lib/python3.6/dist-packages (from pyramid.arima) (0.29.21)
Requirement already satisfied: pandas>=0.19 in /usr/local/lib/python3.6/dist-packages (from pyramid.arima) (1.0.5)
Requirement already satisfied: scipy>=0.9 in /usr/local/lib/python3.6/dist-packages (from pyramid.arima) (1.4.1)
Requirement already satisfied: joblib>=0.11 in /usr/local/lib/python3.6/dist-packages (from scikit-learn>=0.17->pyramid.arima) (0.16.0)
Requirement already satisfied: patsy>=0.4.0 in /usr/local/lib/python3.6/dist-packages (from statsmodels>=0.9.0->pyramid.arima) (0.5.1)
Requirement already satisfied: python-dateutil>=2.6.1 in /usr/local/lib/python3.6/dist-packages (from pandas>=0.19->pyramid.arima) (2.8.1)
Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.6/dist-packages (from pandas>=0.19->pyramid.arima) (2018.9)
Requirement already satisfied: six in /usr/local/lib/python3.6/dist-packages (from patsy>=0.4.0->statsmodels>=0.9.0->pyramid.arima) (1.15.0)
Installing collected packages: pyramid.arima
Successfully installed pyramid.arima
In [1]:
# Importar paquetes
import matplotlib.pyplot as plt
import datetime
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from fbprophet import Prophet
import warnings
warnings.filterwarnings('ignore')
import seaborn as sns
!pip install plotly
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import datetime as dt
from datetime import timedelta
from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score,silhouette_samples
from sklearn.linear_model import LinearRegression,Ridge,Lasso
from sklearn.svm import SVR
from sklearn.metrics import mean_squared_error,r2_score
from sklearn.preprocessing import PolynomialFeatures
import statsmodels.api as sm
from statsmodels.tsa.api import Holt,SimpleExpSmoothing,ExponentialSmoothing
from statsmodels.tsa.stattools import adfuller
std=StandardScaler()
from pmdarima.arima import auto_arima
pd.set_option('display.float_format', lambda x: '%.6f' % x)
Requirement already satisfied: plotly in c:\users\itco10096\.conda\envs\apc\lib\site-packages (4.9.0)
Requirement already satisfied: six in c:\users\itco10096\.conda\envs\apc\lib\site-packages (from plotly) (1.15.0)
Requirement already satisfied: retrying>=1.3.3 in c:\users\itco10096\.conda\envs\apc\lib\site-packages (from plotly) (1.3.3)
In [2]:
dfCovid = pd.read_csv('https://www.datos.gov.co/api/views/gt2j-8ykr/rows.csv')
In [3]:
dfCovid.head(10)
Out[3]:
ID de caso Fecha de notificación Código DIVIPOLA Ciudad de ubicación Departamento o Distrito atención Edad Sexo Tipo Estado ... FIS Fecha de muerte Fecha diagnostico Fecha recuperado fecha reporte web Tipo recuperación Codigo departamento Codigo pais Pertenencia etnica Nombre grupo etnico
0 1 2020-03-02T00:00:00.000 11001 Bogotá D.C. Bogotá D.C. Recuperado 19 F Importado Leve ... 2020-02-27T00:00:00.000 NaN 2020-03-06T00:00:00.000 2020-03-13T00:00:00.000 2020-03-06T00:00:00.000 PCR 11 380.000000 Otro NaN
1 2 2020-03-06T00:00:00.000 76111 Guadalajara de Buga Valle del Cauca Recuperado 34 M Importado Leve ... 2020-03-04T00:00:00.000 NaN 2020-03-09T00:00:00.000 2020-03-19T00:00:00.000 2020-03-09T00:00:00.000 PCR 76 724.000000 Otro NaN
2 3 2020-03-07T00:00:00.000 5001 Medellín Antioquia Recuperado 50 F Importado Leve ... 2020-02-29T00:00:00.000 NaN 2020-03-09T00:00:00.000 2020-03-15T00:00:00.000 2020-03-09T00:00:00.000 PCR 5 724.000000 Otro NaN
3 4 2020-03-09T00:00:00.000 5001 Medellín Antioquia Recuperado 55 M Relacionado Leve ... 2020-03-06T00:00:00.000 NaN 2020-03-11T00:00:00.000 2020-03-26T00:00:00.000 2020-03-11T00:00:00.000 PCR 5 nan Otro NaN
4 5 2020-03-09T00:00:00.000 5001 Medellín Antioquia Recuperado 25 M Relacionado Leve ... 2020-03-08T00:00:00.000 NaN 2020-03-11T00:00:00.000 2020-03-23T00:00:00.000 2020-03-11T00:00:00.000 PCR 5 nan Otro NaN
5 6 2020-03-10T00:00:00.000 5360 Itagüí Antioquia Recuperado 27 F Relacionado Leve ... 2020-03-06T00:00:00.000 NaN 2020-03-11T00:00:00.000 2020-03-26T00:00:00.000 2020-03-11T00:00:00.000 PCR 5 nan Otro NaN
6 7 2020-03-08T00:00:00.000 13001 Cartagena de Indias Cartagena D.T. y C. Recuperado 85 F Importado Leve ... 2020-03-02T00:00:00.000 NaN 2020-03-11T00:00:00.000 2020-03-17T00:00:00.000 2020-03-11T00:00:00.000 PCR 13 840.000000 Otro NaN
7 8 2020-03-09T00:00:00.000 11001 Bogotá D.C. Bogotá D.C. Recuperado 22 F Importado Leve ... 2020-03-06T00:00:00.000 NaN 2020-03-11T00:00:00.000 2020-03-21T00:00:00.000 2020-03-11T00:00:00.000 PCR 11 724.000000 Otro NaN
8 9 2020-03-08T00:00:00.000 11001 Bogotá D.C. Bogotá D.C. Recuperado 28 F Importado Leve ... 2020-03-07T00:00:00.000 NaN 2020-03-11T00:00:00.000 2020-03-23T00:00:00.000 2020-03-11T00:00:00.000 PCR 11 724.000000 Otro NaN
9 10 2020-03-12T00:00:00.000 11001 Bogotá D.C. Bogotá D.C. Recuperado 36 F Importado Leve ... 2020-03-06T00:00:00.000 NaN 2020-03-12T00:00:00.000 2020-03-21T00:00:00.000 2020-03-12T00:00:00.000 PCR 11 724.000000 Otro NaN

10 rows × 21 columns

In [4]:
# Modificar el tipo de datos para las variables de fechas.
dfCovid['Fecha de notificación']= pd.to_datetime(dfCovid['Fecha de notificación'])
dfCovid[ 'Fecha de muerte']= pd.to_datetime(dfCovid['Fecha de muerte'])
dfCovid['Fecha diagnostico']= pd.to_datetime(dfCovid['Fecha diagnostico'])
dfCovid['Fecha recuperado']= pd.to_datetime(dfCovid['Fecha recuperado'])
dfCovid['fecha reporte web']= pd.to_datetime(dfCovid['fecha reporte web'])
In [5]:
# Limpieza de los resultados para el atributo atención.
dfCovid['atención'].unique()
dfCovid['atención']= dfCovid['atención'].replace({'CASA':'Casa'})
dfCovid['atención']= dfCovid['atención'].fillna('No especifica')
In [6]:
fechas= sorted(pd.concat([dfCovid['Fecha de notificación'],dfCovid['Fecha diagnostico'],dfCovid['Fecha de muerte'],dfCovid['Fecha recuperado'],dfCovid['fecha reporte web']]).unique())
fechas=np.arange(min(fechas),max(fechas),np.timedelta64(86400000000000,'ns'))
dfCovid_Nuevo=pd.DataFrame({'Fecha':fechas})
dfCovid_Nuevo['Muertos']=np.zeros(len(dfCovid_Nuevo))
dfCovid_Nuevo['Confirmados']=np.zeros(len(dfCovid_Nuevo))
dfCovid_Nuevo['Recuperados']=np.zeros(len(dfCovid_Nuevo))
dfCovid_Nuevo
Out[6]:
Fecha Muertos Confirmados Recuperados
0 2020-03-02 0.000000 0.000000 0.000000
1 2020-03-03 0.000000 0.000000 0.000000
2 2020-03-04 0.000000 0.000000 0.000000
3 2020-03-05 0.000000 0.000000 0.000000
4 2020-03-06 0.000000 0.000000 0.000000
... ... ... ... ...
181 2020-08-30 0.000000 0.000000 0.000000
182 2020-08-31 0.000000 0.000000 0.000000
183 2020-09-01 0.000000 0.000000 0.000000
184 2020-09-02 0.000000 0.000000 0.000000
185 2020-09-03 0.000000 0.000000 0.000000

186 rows × 4 columns

COLOMBIA

In [7]:
# Se filtra por la ciudad de interés
#x=dfCovid[dfCovid['Ciudad de ubicación']=='Medellín'].sort_values(by='Fecha de muerte',ascending=False)
x=dfCovid
x=x[['ID de caso','atención','fecha reporte web','Fecha de muerte','Fecha de notificación','Fecha diagnostico','Fecha recuperado']]
x=dfCovid
In [8]:
# Se construye el Data Set Covid-19

#Conteo de muertos
m=x[x['atención']=='Fallecido'].groupby('Fecha de muerte').count()
m=pd.DataFrame({'Fecha':m.index.values,'Muertos':[n for n in m.values[:,0]]})

#Conteo de Confirmados
c=x.groupby('Fecha de notificación').count()
c=pd.DataFrame({'Fecha':c.index.values,'Confirmados':[n for n in c.values[:,0]]})

#Conteo Recuperados
r=x.groupby('Fecha recuperado').count()
r=pd.DataFrame({'Fecha':r.index.values,'Recuperados':[n for n in r.values[:,0]]})

df_Nuevo=pd.concat([dfCovid_Nuevo,c,m,r])
df_Nuevo.sort_values(by='Fecha',ascending=True)
df_Nuevo=df_Nuevo.groupby('Fecha').sum().sort_values(by='Fecha',ascending=True)

def acum(df,Col):
    m=df[Col].values
    d=0
    L=[]
    for n in m:
        d=d+n
        L.append(d)
    return L

df_Nuevo['Acum_muertos']=acum(df_Nuevo,'Muertos')
df_Nuevo['Acum_confirmados']=acum(df_Nuevo,'Confirmados')
df_Nuevo['Acum_Recuperados']=acum(df_Nuevo,'Recuperados')
df_Nuevo['Acum_Activos']=df_Nuevo['Acum_confirmados']-df_Nuevo['Acum_Recuperados']-df_Nuevo['Acum_muertos']
df_Nuevo
Out[8]:
Muertos Confirmados Recuperados Acum_muertos Acum_confirmados Acum_Recuperados Acum_Activos
Fecha
2020-03-02 0.000000 1.000000 0.000000 0.000000 1.000000 0.000000 1.000000
2020-03-03 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.000000
2020-03-04 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.000000
2020-03-05 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.000000
2020-03-06 0.000000 1.000000 0.000000 0.000000 2.000000 0.000000 2.000000
... ... ... ... ... ... ... ...
2020-08-31 203.000000 4112.000000 8797.000000 20365.000000 645348.000000 459444.000000 165539.000000
2020-09-01 187.000000 2929.000000 10230.000000 20552.000000 648277.000000 469674.000000 158051.000000
2020-09-02 167.000000 1383.000000 9826.000000 20719.000000 649660.000000 479500.000000 149441.000000
2020-09-03 138.000000 392.000000 9624.000000 20857.000000 650052.000000 489124.000000 140071.000000
2020-09-04 31.000000 10.000000 9102.000000 20888.000000 650062.000000 498226.000000 130948.000000

187 rows × 7 columns

ANÁLISIS EXPLORATORIO DE DATOS

In [9]:
print("Estructura del dataset: ",df_Nuevo.shape)
print("Variables con valores nulos",df_Nuevo.isnull().sum())
print("Tipo de variables del dataset",df_Nuevo.dtypes)
Estructura del dataset:  (187, 7)
Variables con valores nulos Muertos             0
Confirmados         0
Recuperados         0
Acum_muertos        0
Acum_confirmados    0
Acum_Recuperados    0
Acum_Activos        0
dtype: int64
Tipo de variables del dataset Muertos             float64
Confirmados         float64
Recuperados         float64
Acum_muertos        float64
Acum_confirmados    float64
Acum_Recuperados    float64
Acum_Activos        float64
dtype: object
In [10]:
print("Información Básica")
df_Nuevo.iloc(0)[-1]
Información Básica
Out[10]:
Muertos                31.000000
Confirmados            10.000000
Recuperados          9102.000000
Acum_muertos        20888.000000
Acum_confirmados   650062.000000
Acum_Recuperados   498226.000000
Acum_Activos       130948.000000
Name: 2020-09-04 00:00:00, dtype: float64
In [11]:
fig=px.bar(x=df_Nuevo.index,y=df_Nuevo["Acum_Activos"])
fig.update_layout(title="Distribución del número de casos activos en Colombia",
                  xaxis_title="Fecha",yaxis_title="Número de casos en Colombia",)
fig.show()
In [12]:
fig=px.bar(x=df_Nuevo.index,y=df_Nuevo["Acum_Recuperados"]+df_Nuevo["Acum_muertos"])
fig.update_layout(title="Distribución del número de casos cerrados en Colombia",
                  xaxis_title="Fecha",yaxis_title="Número de casos en Colombia")
fig.show()
In [13]:
df_Nuevo["WeekOfYear"]=df_Nuevo.index.weekofyear

week_num=[]
weekwise_confirmed=[]
weekwise_recovered=[]
weekwise_deaths=[]
weekwise_active=[]
w=1
for i in list(df_Nuevo["WeekOfYear"].unique()):
    weekwise_confirmed.append(df_Nuevo[df_Nuevo["WeekOfYear"]==i]["Acum_confirmados"].iloc[-1])
    weekwise_recovered.append(df_Nuevo[df_Nuevo["WeekOfYear"]==i]["Acum_Recuperados"].iloc[-1])
    weekwise_deaths.append(df_Nuevo[df_Nuevo["WeekOfYear"]==i]["Acum_muertos"].iloc[-1])
    weekwise_active.append(df_Nuevo[df_Nuevo["WeekOfYear"]==i]["Acum_Activos"].iloc[-1])
    week_num.append(w)
    w=w+1

fig=go.Figure()
fig.add_trace(go.Scatter(x=week_num, y=weekwise_confirmed,
                    mode='lines+markers',
                    name='Crecimiento semanal de los casos confirmados'))
fig.add_trace(go.Scatter(x=week_num, y=weekwise_recovered,
                    mode='lines+markers',
                    name='Crecimiento semanal de los casos recuperados'))
fig.add_trace(go.Scatter(x=week_num, y=weekwise_deaths,
                    mode='lines+markers',
                    name='Crecimiento semanal de los casos de muerte'))
fig.add_trace(go.Scatter(x=week_num, y=weekwise_active,
                    mode='lines+markers',
                    name='Crecimiento semanal de los casos Activos'))
fig.update_layout(title="Crecimiento semanal de diferentes tipos de casos en Colombia",
                 xaxis_title="Número de semanas",yaxis_title="Número de casos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [14]:
fig, (ax1,ax2) = plt.subplots(1, 2,figsize=(15,5))
sns.barplot(x=week_num,y=pd.Series(weekwise_confirmed).diff().fillna(0),ax=ax1)
sns.barplot(x=week_num,y=pd.Series(weekwise_deaths).diff().fillna(0),ax=ax2)
ax1.set_xlabel("Número de semanas")
ax2.set_xlabel("Número de semanas")
ax1.set_ylabel("Número de casos confirmados")
ax2.set_ylabel("Número de casos de fallecidos")
ax1.set_title("Aumento semanal del número de casos confirmados en Colombia")
ax2.set_title("Aumento semanal del número de casos de muerte en Colombia")
Out[14]:
Text(0.5, 1.0, 'Aumento semanal del número de casos de muerte en Colombia')

MEDELLÍN

In [15]:
# Se filtra por la ciudad de interés
nombre='Medellín'
x=dfCovid[dfCovid['Ciudad de ubicación']==nombre].sort_values(by='Fecha de muerte',ascending=False)
x=x[['ID de caso','atención','fecha reporte web','Fecha de muerte','Fecha de notificación','Fecha diagnostico','Fecha recuperado']]
x
Out[15]:
ID de caso atención fecha reporte web Fecha de muerte Fecha de notificación Fecha diagnostico Fecha recuperado
508184 508225 Fallecido 2020-08-20 2020-09-04 2020-08-19 2020-08-20 NaT
426027 426068 No especifica 2020-08-13 2020-09-04 2020-08-11 2020-08-12 NaT
572038 572079 Fallecido 2020-08-26 2020-09-04 2020-08-11 2020-08-22 NaT
492014 492055 Fallecido 2020-08-19 2020-09-04 2020-08-13 2020-08-18 NaT
615551 615592 Fallecido 2020-09-01 2020-09-03 2020-08-28 2020-08-31 NaT
... ... ... ... ... ... ... ...
649802 649843 Casa 2020-09-04 NaT 2020-08-23 2020-09-03 NaT
649803 649844 Casa 2020-09-04 NaT 2020-08-23 2020-09-03 NaT
649805 649846 Casa 2020-09-04 NaT 2020-08-23 2020-09-03 NaT
649806 649847 Casa 2020-09-04 NaT 2020-08-23 2020-09-03 NaT
649807 649848 Casa 2020-09-04 NaT 2020-08-23 2020-09-03 NaT

49932 rows × 7 columns

In [16]:
# Se construye el Data Set Covid-19

#Conteo de muertos
m=x[x['atención']=='Fallecido'].groupby('Fecha de muerte').count()
m=pd.DataFrame({'Fecha':m.index.values,'Muertos':[n for n in m.values[:,0]]})

#Conteo de Confirmados
c=x.groupby('Fecha de notificación').count()
c=pd.DataFrame({'Fecha':c.index.values,'Confirmados':[n for n in c.values[:,0]]})

#Conteo Recuperados
r=x.groupby('Fecha recuperado').count()
r=pd.DataFrame({'Fecha':r.index.values,'Recuperados':[n for n in r.values[:,0]]})

df_Nuevo=pd.concat([dfCovid_Nuevo,c,m,r])
df_Nuevo.sort_values(by='Fecha',ascending=True)
df_Nuevo=df_Nuevo.groupby('Fecha').sum().sort_values(by='Fecha',ascending=True)

def acum(df,Col):
  m=df[Col].values
  d=0
  L=[]
  for n in m:
    d=d+n
    L.append(d)
  return L

df_Nuevo['Acum_muertos']=acum(df_Nuevo,'Muertos')
df_Nuevo['Acum_confirmados']=acum(df_Nuevo,'Confirmados')
df_Nuevo['Acum_Recuperados']=acum(df_Nuevo,'Recuperados')
df_Nuevo['Acum_Activos']=df_Nuevo['Acum_confirmados']-df_Nuevo['Acum_Recuperados']-df_Nuevo['Acum_muertos']
df_Nuevo
Out[16]:
Muertos Confirmados Recuperados Acum_muertos Acum_confirmados Acum_Recuperados Acum_Activos
Fecha
2020-03-02 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
2020-03-03 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
2020-03-04 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
2020-03-05 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
2020-03-06 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
... ... ... ... ... ... ... ...
2020-08-31 19.000000 301.000000 822.000000 975.000000 49434.000000 35312.000000 13147.000000
2020-09-01 13.000000 241.000000 1211.000000 988.000000 49675.000000 36523.000000 12164.000000
2020-09-02 12.000000 186.000000 899.000000 1000.000000 49861.000000 37422.000000 11439.000000
2020-09-03 7.000000 69.000000 596.000000 1007.000000 49930.000000 38018.000000 10905.000000
2020-09-04 3.000000 2.000000 1496.000000 1010.000000 49932.000000 39514.000000 9408.000000

187 rows × 7 columns

ANÁLISIS EXPLORATORIO DE DATOS

In [17]:
print("Estructura del dataset: ",df_Nuevo.shape)
print("Variables con valores nulos",df_Nuevo.isnull().sum())
print("Tipo de variables del dataset",df_Nuevo.dtypes)
Estructura del dataset:  (187, 7)
Variables con valores nulos Muertos             0
Confirmados         0
Recuperados         0
Acum_muertos        0
Acum_confirmados    0
Acum_Recuperados    0
Acum_Activos        0
dtype: int64
Tipo de variables del dataset Muertos             float64
Confirmados         float64
Recuperados         float64
Acum_muertos        float64
Acum_confirmados    float64
Acum_Recuperados    float64
Acum_Activos        float64
dtype: object
In [18]:
print("Información Básica")
df_Nuevo.iloc(0)[-1]
Información Básica
Out[18]:
Muertos                3.000000
Confirmados            2.000000
Recuperados         1496.000000
Acum_muertos        1010.000000
Acum_confirmados   49932.000000
Acum_Recuperados   39514.000000
Acum_Activos        9408.000000
Name: 2020-09-04 00:00:00, dtype: float64
In [19]:
fig=px.bar(x=df_Nuevo.index,y=df_Nuevo["Acum_Activos"])
fig.update_layout(title="Distribución del número de casos activos en Medellín ",
                  xaxis_title="Fecha",yaxis_title="Número de casos en Medellín",)
fig.show()
In [20]:
fig=px.bar(x=df_Nuevo.index,y=df_Nuevo["Acum_Recuperados"]+df_Nuevo["Acum_muertos"])
fig.update_layout(title="Distribución del número de casos cerrados en Medellín",
                  xaxis_title="Fecha",yaxis_title="Número de casos en Medellín")
fig.show()
In [21]:
df_Nuevo["WeekOfYear"]=df_Nuevo.index.weekofyear

week_num=[]
weekwise_confirmed=[]
weekwise_recovered=[]
weekwise_deaths=[]
weekwise_active=[]
w=1
for i in list(df_Nuevo["WeekOfYear"].unique()):
    weekwise_confirmed.append(df_Nuevo[df_Nuevo["WeekOfYear"]==i]["Acum_confirmados"].iloc[-1])
    weekwise_recovered.append(df_Nuevo[df_Nuevo["WeekOfYear"]==i]["Acum_Recuperados"].iloc[-1])
    weekwise_deaths.append(df_Nuevo[df_Nuevo["WeekOfYear"]==i]["Acum_muertos"].iloc[-1])
    weekwise_active.append(df_Nuevo[df_Nuevo["WeekOfYear"]==i]["Acum_Activos"].iloc[-1])
    week_num.append(w)
    w=w+1

fig=go.Figure()
fig.add_trace(go.Scatter(x=week_num, y=weekwise_confirmed,
                    mode='lines+markers',
                    name='Crecimiento semanal de los casos confirmados'))
fig.add_trace(go.Scatter(x=week_num, y=weekwise_recovered,
                    mode='lines+markers',
                    name='Crecimiento semanal de los casos recuperados'))
fig.add_trace(go.Scatter(x=week_num, y=weekwise_deaths,
                    mode='lines+markers',
                    name='Crecimiento semanal de los casos de muerte'))
fig.add_trace(go.Scatter(x=week_num, y=weekwise_active,
                    mode='lines+markers',
                    name='Crecimiento semanal de los casos Activos'))
fig.update_layout(title="Crecimiento semanal de diferentes tipos de casos en Medellín",
                 xaxis_title="Número de semanas",yaxis_title="Número de casos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [22]:
fig, (ax1,ax2) = plt.subplots(1, 2,figsize=(15,5))
sns.barplot(x=week_num,y=pd.Series(weekwise_confirmed).diff().fillna(0),ax=ax1)
sns.barplot(x=week_num,y=pd.Series(weekwise_deaths).diff().fillna(0),ax=ax2)
ax1.set_xlabel("Número de semanas")
ax2.set_xlabel("Número de semanas")
ax1.set_ylabel("Número de casos confirmados")
ax2.set_ylabel("Número de casos de fallecidos")
ax1.set_title("Aumento semanal del número de casos confirmados en Medellín")
ax2.set_title("Aumento semanal del número de casos de muerte en Medellín")
Out[22]:
Text(0.5, 1.0, 'Aumento semanal del número de casos de muerte en Medellín')

Tasa de crecimiento de los casos confirmados, recuperados y de muerte

In [23]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_confirmados"],
                    mode='lines+markers',
                    name='Casos confirmados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Recuperados"],
                    mode='lines+markers',
                    name='Casos Recuperados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_muertos"],
                    mode='lines+markers',
                    name='Casos de muertes'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Activos"],
                    mode='lines+markers',
                    name='Casos Activos'))
fig.update_layout(title="Crecimiento de los diferentes tipos de casos en Medellín",
                 xaxis_title="Fecha",yaxis_title="Número de casos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()

Análisis de la tasa de moralidad y recuperación

In [24]:
df_Nuevo["Tasa de mortalidad"]=(df_Nuevo["Acum_muertos"]/df_Nuevo["Acum_confirmados"])*100
df_Nuevo["Tasa de Recuperacion"]=(df_Nuevo["Acum_Recuperados"]/df_Nuevo["Acum_confirmados"])*100
df_Nuevo["Casos Cerrados"]=df_Nuevo["Acum_Recuperados"]+df_Nuevo["Acum_muertos"]

print("Tasa de mortalidad media",df_Nuevo["Tasa de mortalidad"].mean())
print("Tasa de mortalidad media",df_Nuevo["Tasa de mortalidad"].median())
print("Promedio de la tasa de recuperación",df_Nuevo["Tasa de Recuperacion"].mean())
print("Tasa de recuperación media",df_Nuevo["Tasa de Recuperacion"].median())

#Plotting Mortality and Recovery Rate 
fig = make_subplots(rows=2, cols=1,
                   subplot_titles=("Tasa de Recuperacion", "Tasa de mortalidad"))
fig.add_trace(
    go.Scatter(x=df_Nuevo.index, y=(df_Nuevo["Acum_Recuperados"]/df_Nuevo["Acum_confirmados"])*100,name="Tasa de Recuperacion"),
    row=1, col=1
)
fig.add_trace(
    go.Scatter(x=df_Nuevo.index, y=(df_Nuevo["Acum_muertos"]/df_Nuevo["Acum_confirmados"])*100,name="Tasa de mortalidad"),
    row=2, col=1
)
fig.update_layout(height=1000,legend=dict(x=-0.1,y=1.2,traceorder="normal"))
fig.update_xaxes(title_text="Fecha", row=1, col=1)
fig.update_yaxes(title_text="Tasa de Recuperacion en Medellín", row=1, col=1)
fig.update_xaxes(title_text="Fecha", row=1, col=2)
fig.update_yaxes(title_text="Tasa de mortalidad en Medellín", row=1, col=2)
fig.show()
Tasa de mortalidad media 0.798497717743963
Tasa de mortalidad media 0.7142857142857143
Promedio de la tasa de recuperación 35.21689621660824
Tasa de recuperación media 35.128205128205124
In [25]:
print("Aumento medio del número de casos confirmados cada día en Medellín: ",np.round(df_Nuevo["Acum_confirmados"].diff().fillna(0).mean()))
print("Aumento medio del número de casos recuperados cada día en Medellín: ",np.round(df_Nuevo["Acum_Recuperados"].diff().fillna(0).mean()))
print("Aumento promedio del número de casos de muerte cada día en Medellín: ",np.round(df_Nuevo["Acum_muertos"].diff().fillna(0).mean()))
print("Aumento promedio del número de casos de activos cada día en Medellín: ",np.round(df_Nuevo["Acum_Activos"].diff().fillna(0).mean()))

fig=go.Figure()
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_confirmados"].diff().fillna(0),mode='lines+markers',
                    name='Casos de confirmados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Recuperados"].diff().fillna(0),mode='lines+markers',
                    name='Casos de recuperados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_muertos"].diff().fillna(0),mode='lines+markers',
                    name='Casos de Muerte'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Activos"].diff().fillna(0),mode='lines+markers',
                    name='Casos Activos'))
fig.update_layout(title="Aumento diario de los diferentes tipos de casos en Medellín",
                 xaxis_title="Fecha",yaxis_title="Número de casos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
Aumento medio del número de casos confirmados cada día en Medellín:  267.0
Aumento medio del número de casos recuperados cada día en Medellín:  211.0
Aumento promedio del número de casos de muerte cada día en Medellín:  5.0
Aumento promedio del número de casos de activos cada día en Medellín:  50.0
In [26]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_confirmados"].diff().rolling(window=7).mean(),mode='lines+markers',
                    name='Casos Confirmados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Recuperados"].diff().rolling(window=7).mean(),mode='lines+markers',
                    name='Casos Recuperados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_muertos"].diff().rolling(window=7).mean(),mode='lines+markers',
                    name='Casos Fallecidos'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Activos"].diff().rolling(window=7).mean(),mode='lines+markers',
                    name='Casos Activos'))
fig.update_layout(title="Media móvil por cada 7 días de los casos confirmados, recuperados y de muerte en Medellín",
                 xaxis_title="Fecha",yaxis_title="Número de casos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [27]:
print("Promedio de crecimiento medio del número de casos confirmados en Medellín: ",(df_Nuevo["Acum_confirmados"]/df_Nuevo["Acum_confirmados"].shift()).mean())
print("Mediana de crecimiento medio del número de casos confirmados en Medellín: ",(df_Nuevo["Acum_confirmados"]/df_Nuevo["Acum_confirmados"].shift()).median())
print("Promedio de crecimiento medio del número de casos recuperados en Medellín: ",(df_Nuevo["Acum_Recuperados"]/df_Nuevo["Acum_Recuperados"].shift()).mean())
print("Mediana de crecimiento medio del número de casos recuperados en Medellín: ",(df_Nuevo["Acum_Recuperados"]/df_Nuevo["Acum_Recuperados"].shift()).median())
print("Promedio de crecimiento medio del número de casos de muerte en Medellín: ",(df_Nuevo["Acum_muertos"]/df_Nuevo["Acum_muertos"].shift()).mean())
print("Mediana de crecimiento medio del número de casos de muerte en Medellín: ",(df_Nuevo["Acum_muertos"]/df_Nuevo["Acum_muertos"].shift()).median())

fig=go.Figure()
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_confirmados"]/df_Nuevo["Acum_confirmados"].shift(),
                    mode='lines',
                    name='Factor de crecimiento de los casos confirmados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Recuperados"]/df_Nuevo["Acum_Recuperados"].shift(),
                    mode='lines',
                    name='Factor de crecimiento de los casos recuperados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_muertos"]/df_Nuevo["Acum_muertos"].shift(),
                    mode='lines',
                    name='Factor de crecimiento de los casos de muerte'))
fig.update_layout(title="Factor de crecimiento en función de la fecha de los diferentes tipos de casos en Medellín",
                 xaxis_title="Fecha",yaxis_title="Factor de crecimiento",
                 legend=dict(x=0,y=-0.4,traceorder="normal"))
fig.show()
Promedio de crecimiento medio del número de casos confirmados en Medellín:  inf
Mediana de crecimiento medio del número de casos confirmados en Medellín:  1.0342011880906008
Promedio de crecimiento medio del número de casos recuperados en Medellín:  inf
Mediana de crecimiento medio del número de casos recuperados en Medellín:  1.0409844296936737
Promedio de crecimiento medio del número de casos de muerte en Medellín:  inf
Mediana de crecimiento medio del número de casos de muerte en Medellín:  1.0121457489878543

MODELOS DE PREDICCIÓN MEDELLÍN

CASOS CONFIRMADOS

Modelo de regresión lineal para la predicción

In [28]:
df_Nuevo["Fecha"]=df_Nuevo.index-df_Nuevo.index[0]
df_Nuevo["Fecha"]=df_Nuevo["Fecha"].dt.days
In [29]:
train_ml=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid_ml=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
model_scores=[]
In [30]:
lin_reg=LinearRegression(normalize=True)
In [31]:
lin_reg.fit(np.array(train_ml["Fecha"]).reshape(-1,1),np.array(train_ml["Acum_confirmados"]).reshape(-1,1))
Out[31]:
LinearRegression(normalize=True)
In [32]:
prediction_valid_linreg=lin_reg.predict(np.array(valid_ml["Fecha"]).reshape(-1,1))
In [33]:
model_scores.append(np.sqrt(mean_squared_error(valid_ml["Acum_confirmados"],prediction_valid_linreg)))
print("Error del cuadrado medio de la raíz para la regresión lineal en Medellín: ",np.sqrt(mean_squared_error(valid_ml["Confirmados"],prediction_valid_linreg)))
Error del cuadrado medio de la raíz para la regresión lineal en Medellín:  29538.98276518617
In [34]:
plt.figure(figsize=(11,6))
prediction_linreg=lin_reg.predict(np.array(df_Nuevo["Fecha"]).reshape(-1,1))
linreg_output=[]
for i in range(prediction_linreg.shape[0]):
    linreg_output.append(prediction_linreg[i][0])

fig=go.Figure()
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_confirmados"],
                    mode='lines+markers',name="Datos de entrenamiento para casos confirmados"))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=linreg_output,
                    mode='lines',name="Regresión lineal de mejor ajuste",
                    line=dict(color='black', dash='dot')))
fig.update_layout(title="Casos confirmados Predicción de regresión lineal",
                 xaxis_title="Fecha",yaxis_title="Confirmados",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
<Figure size 792x432 with 0 Axes>

Regresión polinómica para la prediccción

In [35]:
train_ml=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid_ml=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
In [36]:
poly = PolynomialFeatures(degree = 4) 
In [37]:
train_poly=poly.fit_transform(np.array(train_ml["Fecha"]).reshape(-1,1))
valid_poly=poly.fit_transform(np.array(valid_ml["Fecha"]).reshape(-1,1))
y=train_ml["Acum_confirmados"]
In [38]:
linreg=LinearRegression(normalize=True)
linreg.fit(train_poly,y)
Out[38]:
LinearRegression(normalize=True)
In [39]:
prediction_poly=linreg.predict(valid_poly)
rmse_poly=np.sqrt(mean_squared_error(valid_ml["Acum_confirmados"],prediction_poly))
model_scores.append(rmse_poly)
print("Error de la media cuadrática de la raíz para la regresión polinómica para Medellín: ",rmse_poly)
Error de la media cuadrática de la raíz para la regresión polinómica para Medellín:  10477.575006024432
In [40]:
comp_data=poly.fit_transform(np.array(df_Nuevo["Fecha"]).reshape(-1,1))
plt.figure(figsize=(11,6))
predictions_poly=linreg.predict(comp_data)

fig=go.Figure()
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_confirmados"],
                    mode='lines+markers',name="Datos de entrenamiento para casos confirmados"))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=predictions_poly,
                    mode='lines',name="El mejor ajuste de la regresión polinómica",
                    line=dict(color='black', dash='dot')))
fig.update_layout(title="Casos confirmados Predicción de regresión polinómica en Medellín",
                 xaxis_title="Fecha",yaxis_title="Acum_confirmados",
                 legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
<Figure size 792x432 with 0 Axes>
In [41]:
new_prediction_poly=[]
for i in range(1,18):
    new_date_poly=poly.fit_transform(np.array(df_Nuevo["Fecha"].max()+i).reshape(-1,1))
    new_prediction_poly.append(linreg.predict(new_date_poly)[0])

Modelo de Máquina de Vectores de Soporte

In [42]:
train_ml=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid_ml=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
In [43]:
#Iniciando el modelo de SVR
svm=SVR(C=1,degree=2,kernel='poly',epsilon=0.01)
In [44]:
#Modelo de ajuste en los datos de entrenamiento
svm.fit(np.array(train_ml["Fecha"]).reshape(-1,1),np.array(train_ml["Acum_confirmados"]).reshape(-1,1))
Out[44]:
SVR(C=1, degree=2, epsilon=0.01, kernel='poly')
In [45]:
prediction_valid_svm=svm.predict(np.array(valid_ml["Fecha"]).reshape(-1,1))
In [46]:
model_scores.append(np.sqrt(mean_squared_error(valid_ml["Acum_confirmados"],prediction_valid_svm)))
print("Error del cuadrado medio de la raíz para SVM en Medellín: ",np.sqrt(mean_squared_error(valid_ml["Acum_confirmados"],prediction_valid_svm)))
Error del cuadrado medio de la raíz para SVM en Medellín:  44702.98627579917
In [47]:
plt.figure(figsize=(11,6))
prediction_svm=svm.predict(np.array(df_Nuevo["Fecha"]).reshape(-1,1))
fig=go.Figure()
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_confirmados"],
                    mode='lines+markers',name="Datos de entrenamiento para casos confirmados"))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=prediction_svm,
                    mode='lines',name="SVM adecuado",
                    line=dict(color='black', dash='dot')))
fig.update_layout(title="Casos confirmados usando el SVM para Medellín",
                 xaxis_title="Fecha",yaxis_title="Casos Confirmados",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
<Figure size 792x432 with 0 Axes>
In [48]:
new_date=[]
new_prediction_lr=[]
new_prediction_svm=[]
for i in range(1,18):
    new_date.append(df_Nuevo.index[-1]+timedelta(days=i))
    new_prediction_lr.append(lin_reg.predict(np.array(df_Nuevo["Fecha"].max()+i).reshape(-1,1))[0][0])
    new_prediction_svm.append(svm.predict(np.array(df_Nuevo["Fecha"].max()+i).reshape(-1,1))[0])
In [49]:
pd.set_option('display.float_format', lambda x: '%.6f' % x)
model_predictions=pd.DataFrame(zip(new_date,new_prediction_lr,new_prediction_poly,new_prediction_svm),
                               columns=["Fecha","Regresión Lineal","Regresión Polinomial","SVM"])
model_predictions.head()
Out[49]:
Fecha Regresión Lineal Regresión Polinomial SVM
0 2020-09-05 30719.210809 65751.674036 4998.215457
1 2020-09-06 30942.068621 67173.856834 5051.937999
2 2020-09-07 31164.926433 68612.535208 5105.947060
3 2020-09-08 31387.784245 70067.707666 5160.242642
4 2020-09-09 31610.642056 71539.370934 5214.824744

Método Holt

In [50]:
model_train=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
y_pred=valid.copy()
In [51]:
holt=Holt(np.asarray(model_train["Acum_confirmados"])).fit(smoothing_level=0.2, smoothing_slope=1.8,optimized=False)
In [52]:
y_pred["Holt"]=holt.forecast(len(valid))
model_scores.append(np.sqrt(mean_squared_error(y_pred["Acum_confirmados"],y_pred["Holt"])))
print("Error del cuadrado medio del HOLT: ",np.sqrt(mean_squared_error(y_pred["Acum_confirmados"],y_pred["Holt"])))
Error del cuadrado medio del HOLT:  99.72564052854553
In [53]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=model_train.index, y=model_train["Acum_confirmados"],
                    mode='lines+markers',name="Train Data for Confirmed Cases"))
fig.add_trace(go.Scatter(x=valid.index, y=valid["Acum_confirmados"],
                    mode='lines+markers',name="Datos de validación para datos confirmados",))
fig.add_trace(go.Scatter(x=valid.index, y=y_pred["Holt"],
                    mode='lines+markers',name="Predicción de casos Confirmados",))
fig.update_layout(title="Casos Confirmados usando el modelo de Predicción HOLT",
                 xaxis_title="Fecha",yaxis_title="Casos Confirmados",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [54]:
holt_new_date=[]
holt_new_prediction=[]
for i in range(1,18):
    holt_new_date.append(df_Nuevo.index[-1]+timedelta(days=i))
    holt_new_prediction.append(holt.forecast((len(valid)+i))[-1])

model_predictions["Modelo de predicción HOLT"]=holt_new_prediction
model_predictions.head()
Out[54]:
Fecha Regresión Lineal Regresión Polinomial SVM Modelo de predicción HOLT
0 2020-09-05 30719.210809 65751.674036 4998.215457 50272.798806
1 2020-09-06 30942.068621 67173.856834 5051.937999 50458.501321
2 2020-09-07 31164.926433 68612.535208 5105.947060 50644.203835
3 2020-09-08 31387.784245 70067.707666 5160.242642 50829.906350
4 2020-09-09 31610.642056 71539.370934 5214.824744 51015.608865

Modelo MA (Usando Auto ARIMA)

In [55]:
model_train=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
y_pred=valid.copy()
In [56]:
model_ma= auto_arima(model_train["Acum_confirmados"],trace=True, error_action='ignore', start_p=0,start_q=0,max_p=0,max_q=5,
                   suppress_warnings=True,stepwise=False,seasonal=False)
model_ma.fit(model_train["Acum_confirmados"])
 ARIMA(0,2,0)(0,0,0)[0] intercept   : AIC=2154.920, Time=0.04 sec
 ARIMA(0,2,1)(0,0,0)[0] intercept   : AIC=2117.799, Time=0.13 sec
 ARIMA(0,2,2)(0,0,0)[0] intercept   : AIC=2119.110, Time=0.31 sec
 ARIMA(0,2,3)(0,0,0)[0] intercept   : AIC=2115.993, Time=0.39 sec
 ARIMA(0,2,4)(0,0,0)[0] intercept   : AIC=2117.743, Time=0.34 sec
 ARIMA(0,2,5)(0,0,0)[0] intercept   : AIC=2119.168, Time=0.50 sec
Total fit time: 1.730 seconds
Out[56]:
ARIMA(order=(0, 2, 3), scoring_args={}, suppress_warnings=True)
In [57]:
prediction_ma=model_ma.predict(len(valid))
y_pred["MA Model Prediction"]=prediction_ma
In [58]:
model_scores.append(np.sqrt(mean_squared_error(valid["Acum_confirmados"],prediction_ma)))
print("Error Cuadrático Medio Modelo MA: ",np.sqrt(mean_squared_error(valid["Acum_confirmados"],prediction_ma)))
Error Cuadrático Medio Modelo MA:  518.1924076830215
In [59]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=model_train.index, y=model_train["Acum_confirmados"],
                    mode='lines+markers',name="Datos de entrenamiento para casos Confirmados"))
fig.add_trace(go.Scatter(x=valid.index, y=valid["Acum_confirmados"],
                    mode='lines+markers',name="Datos de Validación para casos confirmados",))
fig.add_trace(go.Scatter(x=valid.index, y=y_pred["MA Model Prediction"],
                    mode='lines+markers',name="Predicción de casos confirmados",))
fig.update_layout(title="Predicción de casos confirmados para el modelo MA",
                 xaxis_title="Fecha",yaxis_title="Casos Confirmados",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [60]:
MA_model_new_prediction=[]
for i in range(1,18):
    MA_model_new_prediction.append(model_ma.predict(len(valid)+i)[-1])
model_predictions["Modelo MA"]=MA_model_new_prediction
model_predictions.head()
Out[60]:
Fecha Regresión Lineal Regresión Polinomial SVM Modelo de predicción HOLT Modelo MA
0 2020-09-05 30719.210809 65751.674036 4998.215457 50272.798806 51276.877542
1 2020-09-06 30942.068621 67173.856834 5051.937999 50458.501321 51591.102774
2 2020-09-07 31164.926433 68612.535208 5105.947060 50644.203835 51907.009928
3 2020-09-08 31387.784245 70067.707666 5160.242642 50829.906350 52224.599005
4 2020-09-09 31610.642056 71539.370934 5214.824744 51015.608865 52543.870004

Modelo ARIMA (Usando Auto-ARIMA)

In [61]:
model_train=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
y_pred=valid.copy()
In [62]:
model_arima= auto_arima(model_train["Acum_confirmados"],trace=True, error_action='ignore', start_p=1,start_q=1,max_p=3,max_q=3,
                   suppress_warnings=True,stepwise=False,seasonal=False)
model_arima.fit(model_train["Acum_confirmados"])
 ARIMA(0,2,0)(0,0,0)[0] intercept   : AIC=2154.920, Time=0.02 sec
 ARIMA(0,2,1)(0,0,0)[0] intercept   : AIC=2117.799, Time=0.11 sec
 ARIMA(0,2,2)(0,0,0)[0] intercept   : AIC=2119.110, Time=0.30 sec
 ARIMA(0,2,3)(0,0,0)[0] intercept   : AIC=2115.993, Time=0.34 sec
 ARIMA(1,2,0)(0,0,0)[0] intercept   : AIC=2127.851, Time=0.17 sec
 ARIMA(1,2,1)(0,0,0)[0] intercept   : AIC=2119.450, Time=0.28 sec
 ARIMA(1,2,2)(0,0,0)[0] intercept   : AIC=2115.961, Time=0.41 sec
 ARIMA(1,2,3)(0,0,0)[0] intercept   : AIC=2117.838, Time=0.45 sec
 ARIMA(2,2,0)(0,0,0)[0] intercept   : AIC=2116.264, Time=0.16 sec
 ARIMA(2,2,1)(0,0,0)[0] intercept   : AIC=2117.851, Time=0.38 sec
 ARIMA(2,2,2)(0,0,0)[0] intercept   : AIC=2117.252, Time=0.68 sec
 ARIMA(2,2,3)(0,0,0)[0] intercept   : AIC=2096.997, Time=0.84 sec
 ARIMA(3,2,0)(0,0,0)[0] intercept   : AIC=2117.463, Time=0.18 sec
 ARIMA(3,2,1)(0,0,0)[0] intercept   : AIC=2119.177, Time=0.45 sec
 ARIMA(3,2,2)(0,0,0)[0] intercept   : AIC=2115.542, Time=0.57 sec
Total fit time: 5.357 seconds
Out[62]:
ARIMA(order=(2, 2, 3), scoring_args={}, suppress_warnings=True)
In [63]:
prediction_arima=model_arima.predict(len(valid))
y_pred["ARIMA Model Prediction"]=prediction_arima
In [64]:
model_scores.append(np.sqrt(mean_squared_error(valid["Acum_confirmados"],prediction_arima)))
print("Error Cuadrático Medio Modelo ARIMA: ",np.sqrt(mean_squared_error(valid["Acum_confirmados"],prediction_arima)))
Error Cuadrático Medio Modelo ARIMA:  896.7248522455903
In [65]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=model_train.index, y=model_train["Acum_confirmados"],
                    mode='lines+markers',name="Datos de entrenamiento para casos confirmados"))
fig.add_trace(go.Scatter(x=valid.index, y=valid["Acum_confirmados"],
                    mode='lines+markers',name="Datos de validación para datos confirmados",))
fig.add_trace(go.Scatter(x=valid.index, y=y_pred["ARIMA Model Prediction"],
                    mode='lines+markers',name="Predicción de casos confirmados",))
fig.update_layout(title="Predicción de casos confirmados con el modelo ARIMA de Medellín",
                 xaxis_title="Fecha",yaxis_title="Acum_confirmados",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [66]:
ARIMA_model_new_prediction=[]
for i in range(1,18):
    ARIMA_model_new_prediction.append(model_arima.predict(len(valid)+i)[-1])
model_predictions["ARIMA Model Prediction"]=ARIMA_model_new_prediction
model_predictions.head()
Out[66]:
Fecha Regresión Lineal Regresión Polinomial SVM Modelo de predicción HOLT Modelo MA ARIMA Model Prediction
0 2020-09-05 30719.210809 65751.674036 4998.215457 50272.798806 51276.877542 52001.260471
1 2020-09-06 30942.068621 67173.856834 5051.937999 50458.501321 51591.102774 52388.322541
2 2020-09-07 31164.926433 68612.535208 5105.947060 50644.203835 51907.009928 52787.590530
3 2020-09-08 31387.784245 70067.707666 5160.242642 50829.906350 52224.599005 53204.845544
4 2020-09-09 31610.642056 71539.370934 5214.824744 51015.608865 52543.870004 53605.806111

Modelo SARIMA (Usanto Auto ARIMA)

In [67]:
model_sarima= auto_arima(model_train["Acum_confirmados"],trace=True, error_action='ignore', 
                         start_p=0,start_q=0,max_p=2,max_q=2,m=7,
                   suppress_warnings=True,stepwise=True,seasonal=True)
model_sarima.fit(model_train["Acum_confirmados"])
Performing stepwise search to minimize aic
 ARIMA(0,2,0)(1,0,1)[7]             : AIC=2106.901, Time=0.22 sec
 ARIMA(0,2,0)(0,0,0)[7]             : AIC=2152.968, Time=0.02 sec
 ARIMA(1,2,0)(1,0,0)[7]             : AIC=2084.913, Time=0.11 sec
 ARIMA(0,2,1)(0,0,1)[7]             : AIC=2092.465, Time=0.19 sec
 ARIMA(1,2,0)(0,0,0)[7]             : AIC=2125.965, Time=0.06 sec
 ARIMA(1,2,0)(2,0,0)[7]             : AIC=2082.339, Time=0.26 sec
 ARIMA(1,2,0)(2,0,1)[7]             : AIC=2083.943, Time=0.52 sec
 ARIMA(1,2,0)(1,0,1)[7]             : AIC=2082.068, Time=0.34 sec
 ARIMA(1,2,0)(0,0,1)[7]             : AIC=2097.359, Time=0.27 sec
 ARIMA(1,2,0)(1,0,2)[7]             : AIC=2083.861, Time=0.61 sec
 ARIMA(1,2,0)(0,0,2)[7]             : AIC=2090.633, Time=0.33 sec
 ARIMA(1,2,0)(2,0,2)[7]             : AIC=inf, Time=0.97 sec
 ARIMA(2,2,0)(1,0,1)[7]             : AIC=2079.174, Time=0.38 sec
 ARIMA(2,2,0)(0,0,1)[7]             : AIC=2093.361, Time=0.22 sec
 ARIMA(2,2,0)(1,0,0)[7]             : AIC=2082.812, Time=0.19 sec
 ARIMA(2,2,0)(2,0,1)[7]             : AIC=2080.929, Time=0.68 sec
 ARIMA(2,2,0)(1,0,2)[7]             : AIC=2080.810, Time=0.65 sec
 ARIMA(2,2,0)(0,0,0)[7]             : AIC=2114.489, Time=0.08 sec
 ARIMA(2,2,0)(0,0,2)[7]             : AIC=2086.558, Time=0.42 sec
 ARIMA(2,2,0)(2,0,0)[7]             : AIC=2079.397, Time=0.36 sec
 ARIMA(2,2,0)(2,0,2)[7]             : AIC=2082.183, Time=1.38 sec
 ARIMA(2,2,1)(1,0,1)[7]             : AIC=2081.137, Time=0.85 sec
 ARIMA(1,2,1)(1,0,1)[7]             : AIC=2080.014, Time=0.49 sec
 ARIMA(2,2,0)(1,0,1)[7] intercept   : AIC=2081.124, Time=0.89 sec

Best model:  ARIMA(2,2,0)(1,0,1)[7]          
Total fit time: 10.537 seconds
Out[67]:
ARIMA(order=(2, 2, 0), scoring_args={}, seasonal_order=(1, 0, 1, 7),
      suppress_warnings=True, with_intercept=False)
In [68]:
prediction_sarima=model_sarima.predict(len(valid))
y_pred["SARIMA Model Prediction"]=prediction_sarima
In [69]:
model_scores.append(np.sqrt(mean_squared_error(y_pred["Acum_confirmados"],y_pred["SARIMA Model Prediction"])))
print("Error Cuadrático Medio Modelo SARIMA: ",np.sqrt(mean_squared_error(y_pred["Acum_confirmados"],y_pred["SARIMA Model Prediction"])))
Error Cuadrático Medio Modelo SARIMA:  92.26286469396929
In [70]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=model_train.index, y=model_train["Acum_confirmados"],
                    mode='lines+markers',name="Datos de entrenamiento para casos confirmados"))
fig.add_trace(go.Scatter(x=valid.index, y=valid["Acum_confirmados"],
                    mode='lines+markers',name="Datos de validación para casos confirmados",))
fig.add_trace(go.Scatter(x=valid.index, y=y_pred["SARIMA Model Prediction"],
                    mode='lines+markers',name="Predicción para casos confirmados",))
fig.update_layout(title="Predicción de datos confirmados modelo SARIMA en Medellín",
                 xaxis_title="Fecha",yaxis_title="Casos Confirmados",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [71]:
SARIMA_model_new_prediction=[]
for i in range(1,18):
    SARIMA_model_new_prediction.append(model_sarima.predict(len(valid)+i)[-1])
model_predictions["Modelo SARIMA"]=SARIMA_model_new_prediction
model_predictions.head()
Out[71]:
Fecha Regresión Lineal Regresión Polinomial SVM Modelo de predicción HOLT Modelo MA ARIMA Model Prediction Modelo SARIMA
0 2020-09-05 30719.210809 65751.674036 4998.215457 50272.798806 51276.877542 52001.260471 49965.472649
1 2020-09-06 30942.068621 67173.856834 5051.937999 50458.501321 51591.102774 52388.322541 49989.343000
2 2020-09-07 31164.926433 68612.535208 5105.947060 50644.203835 51907.009928 52787.590530 50049.162425
3 2020-09-08 31387.784245 70067.707666 5160.242642 50829.906350 52224.599005 53204.845544 50074.934201
4 2020-09-09 31610.642056 71539.370934 5214.824744 51015.608865 52543.870004 53605.806111 50063.043191

Modelo Prophet

In [72]:
prophet_c=Prophet(interval_width=0.75,weekly_seasonality=True,)
prophet_confirmed=pd.DataFrame(zip(list(df_Nuevo.index),list(df_Nuevo["Acum_confirmados"])),columns=['ds','y'])
In [73]:
prophet_c.fit(prophet_confirmed)
INFO:fbprophet:Disabling yearly seasonality. Run prophet with yearly_seasonality=True to override this.
INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.
Out[73]:
<fbprophet.forecaster.Prophet at 0x1c22415e0c8>
In [74]:
forecast_c=prophet_c.make_future_dataframe(periods=17)
forecast_confirmed=forecast_c.copy()
In [75]:
confirmed_forecast=prophet_c.predict(forecast_c)
In [76]:
model_scores.append(np.sqrt(mean_squared_error(df_Nuevo["Acum_confirmados"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
print("Error Cuadrático Medio Modelo Prophet: ",np.sqrt(mean_squared_error(df_Nuevo["Acum_confirmados"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
Error Cuadrático Medio Modelo Prophet:  669.0332529457368
In [77]:
print(prophet_c.plot(confirmed_forecast))
Figure(720x432)
In [78]:
print(prophet_c.plot_components(confirmed_forecast))
Figure(648x432)
In [79]:
model_names=["Linear Regression","Polynomial Regression","Support Vector Machine Regressor","Holt's Linear",
            "Auto Regressive Model (AR)","Moving Average Model (MA)","ARIMA Model","SARIMA Model","Facebook's Prophet Model"]
model_summary=pd.DataFrame(zip(model_names,model_scores),columns=["Model Name","Root Mean Squared Error"]).sort_values(["Root Mean Squared Error"])
model_summary
Out[79]:
Model Name Root Mean Squared Error
6 ARIMA Model 92.262865
3 Holt's Linear 99.725641
4 Auto Regressive Model (AR) 518.192408
7 SARIMA Model 669.033253
5 Moving Average Model (MA) 896.724852
1 Polynomial Regression 10477.575006
0 Linear Regression 19746.710407
2 Support Vector Machine Regressor 44702.986276
In [80]:
model_predictions["Prophet's Prediction"]=list(confirmed_forecast["yhat"].tail(17))
model_predictions["Prophet's Upper Bound"]=list(confirmed_forecast["yhat_upper"].tail(17))
model_predictions.head()
Out[80]:
Fecha Regresión Lineal Regresión Polinomial SVM Modelo de predicción HOLT Modelo MA ARIMA Model Prediction Modelo SARIMA Prophet's Prediction Prophet's Upper Bound
0 2020-09-05 30719.210809 65751.674036 4998.215457 50272.798806 51276.877542 52001.260471 49965.472649 54743.157975 55529.874802
1 2020-09-06 30942.068621 67173.856834 5051.937999 50458.501321 51591.102774 52388.322541 49989.343000 55385.285738 56175.988560
2 2020-09-07 31164.926433 68612.535208 5105.947060 50644.203835 51907.009928 52787.590530 50049.162425 56109.653577 56818.865759
3 2020-09-08 31387.784245 70067.707666 5160.242642 50829.906350 52224.599005 53204.845544 50074.934201 56833.779623 57620.816751
4 2020-09-09 31610.642056 71539.370934 5214.824744 51015.608865 52543.870004 53605.806111 50063.043191 57542.345348 58379.176632

CASOS FALLECIDOS

Modelo ARIMA (Usando Auto-ARIMA)

In [81]:
model_train=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
y_pred=valid.copy()
In [82]:
model_arima= auto_arima(model_train["Acum_muertos"],trace=True, error_action='ignore', start_p=1,start_q=1,max_p=3,max_q=3,
                   suppress_warnings=True,stepwise=False,seasonal=False)
model_arima.fit(model_train["Acum_muertos"])
 ARIMA(0,2,0)(0,0,0)[0] intercept   : AIC=999.334, Time=0.02 sec
 ARIMA(0,2,1)(0,0,0)[0] intercept   : AIC=896.930, Time=0.10 sec
 ARIMA(0,2,2)(0,0,0)[0] intercept   : AIC=893.105, Time=0.14 sec
 ARIMA(0,2,3)(0,0,0)[0] intercept   : AIC=893.299, Time=0.16 sec
 ARIMA(1,2,0)(0,0,0)[0] intercept   : AIC=921.153, Time=0.06 sec
 ARIMA(1,2,1)(0,0,0)[0] intercept   : AIC=892.224, Time=0.12 sec
 ARIMA(1,2,2)(0,0,0)[0] intercept   : AIC=894.086, Time=0.21 sec
 ARIMA(1,2,3)(0,0,0)[0] intercept   : AIC=895.270, Time=0.41 sec
 ARIMA(2,2,0)(0,0,0)[0] intercept   : AIC=903.410, Time=0.12 sec
 ARIMA(2,2,1)(0,0,0)[0] intercept   : AIC=894.020, Time=0.19 sec
 ARIMA(2,2,2)(0,0,0)[0] intercept   : AIC=895.986, Time=0.39 sec
 ARIMA(2,2,3)(0,0,0)[0] intercept   : AIC=889.192, Time=0.49 sec
 ARIMA(3,2,0)(0,0,0)[0] intercept   : AIC=901.830, Time=0.14 sec
 ARIMA(3,2,1)(0,0,0)[0] intercept   : AIC=895.814, Time=0.21 sec
 ARIMA(3,2,2)(0,0,0)[0] intercept   : AIC=897.768, Time=0.39 sec
Total fit time: 3.154 seconds
Out[82]:
ARIMA(order=(2, 2, 3), scoring_args={}, suppress_warnings=True)
In [83]:
prediction_arima=model_arima.predict(len(valid))
y_pred["ARIMA Model Prediction"]=prediction_arima
In [84]:
model_scores.append(np.sqrt(mean_squared_error(valid["Acum_muertos"],prediction_arima)))
print("Error Cuadrático Medio Modelo ARIMA: ",np.sqrt(mean_squared_error(valid["Acum_muertos"],prediction_arima)))
Error Cuadrático Medio Modelo ARIMA:  23.13568504265142
In [85]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=model_train.index, y=model_train["Acum_muertos"],
                    mode='lines+markers',name="Datos de entrenamiento para casos fallecidos"))
fig.add_trace(go.Scatter(x=valid.index, y=valid["Acum_muertos"],
                    mode='lines+markers',name="Datos de validación para datos fallecidos",))
fig.add_trace(go.Scatter(x=valid.index, y=y_pred["ARIMA Model Prediction"],
                    mode='lines+markers',name="Predicción de casos fallecidos",))
fig.update_layout(title="Predicción de casos fallecidos con el modelo ARIMA de Medellín",
                 xaxis_title="Fecha",yaxis_title="Acum_muertos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [86]:
ARIMA_model_new_prediction=[]
for i in range(1,18):
    ARIMA_model_new_prediction.append(model_arima.predict(len(valid)+i)[-1])
In [87]:
pd.DataFrame(zip(new_date,ARIMA_model_new_prediction),columns=["Casos de Muertes","Modelo de Predicción Modelo Arima"]).head()
Out[87]:
Casos de Muertes Modelo de Predicción Modelo Arima
0 2020-09-05 1080.829845
1 2020-09-06 1101.500184
2 2020-09-07 1122.698466
3 2020-09-08 1143.519526
4 2020-09-09 1164.186060

Modelo Prophet

In [88]:
prophet_c=Prophet(interval_width=0.75,weekly_seasonality=True,)
prophet_confirmed=pd.DataFrame(zip(list(df_Nuevo.index),list(df_Nuevo["Acum_muertos"])),columns=['ds','y'])
In [89]:
prophet_c.fit(prophet_confirmed)
INFO:fbprophet:Disabling yearly seasonality. Run prophet with yearly_seasonality=True to override this.
INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.
Out[89]:
<fbprophet.forecaster.Prophet at 0x1c22a664f48>
In [90]:
forecast_c=prophet_c.make_future_dataframe(periods=17)
forecast_confirmed=forecast_c.copy()
In [91]:
confirmed_forecast=prophet_c.predict(forecast_c)
In [92]:
model_scores.append(np.sqrt(mean_squared_error(df_Nuevo["Acum_muertos"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
print("Error Cuadrático Medio Modelo Prophet: ",np.sqrt(mean_squared_error(df_Nuevo["Acum_muertos"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
Error Cuadrático Medio Modelo Prophet:  5.240243729148667
In [93]:
print(prophet_c.plot(confirmed_forecast))
Figure(720x432)
In [94]:
print(prophet_c.plot_components(confirmed_forecast))
Figure(648x432)

CASOS RECUPERADOS

Modelo ARIMA (Usando Auto-ARIMA)

In [95]:
model_train=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
y_pred=valid.copy()
In [96]:
model_arima= auto_arima(model_train["Acum_Recuperados"],trace=True, error_action='ignore', start_p=1,start_q=1,max_p=3,max_q=3,
                   suppress_warnings=True,stepwise=False,seasonal=False)
model_arima.fit(model_train["Acum_Recuperados"])
 ARIMA(0,2,0)(0,0,0)[0] intercept   : AIC=2206.470, Time=0.02 sec
 ARIMA(0,2,1)(0,0,0)[0] intercept   : AIC=2181.551, Time=0.17 sec
 ARIMA(0,2,2)(0,0,0)[0] intercept   : AIC=2183.260, Time=0.28 sec
 ARIMA(0,2,3)(0,0,0)[0] intercept   : AIC=2184.970, Time=0.44 sec
 ARIMA(1,2,0)(0,0,0)[0] intercept   : AIC=2187.113, Time=0.13 sec
 ARIMA(1,2,1)(0,0,0)[0] intercept   : AIC=2183.223, Time=0.28 sec
 ARIMA(1,2,2)(0,0,0)[0] intercept   : AIC=2177.722, Time=0.63 sec
 ARIMA(1,2,3)(0,0,0)[0] intercept   : AIC=2166.374, Time=0.41 sec
 ARIMA(2,2,0)(0,0,0)[0] intercept   : AIC=2186.612, Time=0.21 sec
 ARIMA(2,2,1)(0,0,0)[0] intercept   : AIC=2185.200, Time=0.33 sec
 ARIMA(2,2,2)(0,0,0)[0] intercept   : AIC=2175.458, Time=0.45 sec
 ARIMA(2,2,3)(0,0,0)[0] intercept   : AIC=2145.081, Time=0.80 sec
 ARIMA(3,2,0)(0,0,0)[0] intercept   : AIC=2179.582, Time=0.22 sec
 ARIMA(3,2,1)(0,0,0)[0] intercept   : AIC=2165.488, Time=0.68 sec
 ARIMA(3,2,2)(0,0,0)[0] intercept   : AIC=2165.518, Time=0.71 sec
Total fit time: 5.767 seconds
Out[96]:
ARIMA(order=(2, 2, 3), scoring_args={}, suppress_warnings=True)
In [97]:
prediction_arima=model_arima.predict(len(valid))
y_pred["ARIMA Model Prediction"]=prediction_arima
In [98]:
model_scores.append(np.sqrt(mean_squared_error(valid["Acum_Recuperados"],prediction_arima)))
print("Error Cuadrático Medio Modelo ARIMA: ",np.sqrt(mean_squared_error(valid["Acum_Recuperados"],prediction_arima)))
Error Cuadrático Medio Modelo ARIMA:  379.33604941497975
In [99]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=model_train.index, y=model_train["Acum_Recuperados"],
                    mode='lines+markers',name="Datos de entrenamiento para casos recuperados"))
fig.add_trace(go.Scatter(x=valid.index, y=valid["Acum_Recuperados"],
                    mode='lines+markers',name="Datos de validación para datos recuperados",))
fig.add_trace(go.Scatter(x=valid.index, y=y_pred["ARIMA Model Prediction"],
                    mode='lines+markers',name="Predicción de casos recuperados",))
fig.update_layout(title="Predicción de casos recuperados con el modelo ARIMA de Medellín",
                 xaxis_title="Fecha",yaxis_title="Acum_Recuperados",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [100]:
ARIMA_model_new_prediction=[]
for i in range(1,18):
    ARIMA_model_new_prediction.append(model_arima.predict(len(valid)+i)[-1])
In [101]:
pd.DataFrame(zip(new_date,ARIMA_model_new_prediction),columns=["Recuperados","Predicción Modelo ARIMA"]).head()
Out[101]:
Recuperados Predicción Modelo ARIMA
0 2020-09-05 39564.059233
1 2020-09-06 40422.534116
2 2020-09-07 41318.077913
3 2020-09-08 42189.346927
4 2020-09-09 43091.030863

Modelo Prophet

In [102]:
prophet_c=Prophet(interval_width=0.75,weekly_seasonality=True,)
prophet_confirmed=pd.DataFrame(zip(list(df_Nuevo.index),list(df_Nuevo["Acum_Recuperados"])),columns=['ds','y'])
In [103]:
prophet_c.fit(prophet_confirmed)
INFO:fbprophet:Disabling yearly seasonality. Run prophet with yearly_seasonality=True to override this.
INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.
Out[103]:
<fbprophet.forecaster.Prophet at 0x1c22a431d88>
In [104]:
forecast_c=prophet_c.make_future_dataframe(periods=17)
forecast_confirmed=forecast_c.copy()
In [105]:
confirmed_forecast=prophet_c.predict(forecast_c)
In [106]:
model_scores.append(np.sqrt(mean_squared_error(df_Nuevo["Acum_Recuperados"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
print("Error Cuadrático Medio Modelo Prophet: ",np.sqrt(mean_squared_error(df_Nuevo["Acum_Recuperados"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
Error Cuadrático Medio Modelo Prophet:  588.9208245655668
In [107]:
print(prophet_c.plot(confirmed_forecast))
Figure(720x432)
In [108]:
print(prophet_c.plot_components(confirmed_forecast))
Figure(648x432)
In [109]:
model_names=["Linear Regression","Polynomial Regression","Support Vector Machine Regressor","Holt's Linear",
            "Auto Regressive Model (AR)","Moving Average Model (MA)","ARIMA Model","SARIMA Model","Facebook's Prophet Model"]
model_summary=pd.DataFrame(zip(model_names,model_scores),columns=["Model Name","Root Mean Squared Error"]).sort_values(["Root Mean Squared Error"])
model_summary
Out[109]:
Model Name Root Mean Squared Error
8 Facebook's Prophet Model 23.135685
6 ARIMA Model 92.262865
3 Holt's Linear 99.725641
4 Auto Regressive Model (AR) 518.192408
7 SARIMA Model 669.033253
5 Moving Average Model (MA) 896.724852
1 Polynomial Regression 10477.575006
0 Linear Regression 19746.710407
2 Support Vector Machine Regressor 44702.986276
In [110]:
model_predictions["Prophet's Prediction"]=list(confirmed_forecast["yhat"].tail(17))
model_predictions["Prophet's Upper Bound"]=list(confirmed_forecast["yhat_upper"].tail(17))
model_predictions.head()
Out[110]:
Fecha Regresión Lineal Regresión Polinomial SVM Modelo de predicción HOLT Modelo MA ARIMA Model Prediction Modelo SARIMA Prophet's Prediction Prophet's Upper Bound
0 2020-09-05 30719.210809 65751.674036 4998.215457 50272.798806 51276.877542 52001.260471 49965.472649 39873.006514 40531.789268
1 2020-09-06 30942.068621 67173.856834 5051.937999 50458.501321 51591.102774 52388.322541 49989.343000 40873.525019 41531.603200
2 2020-09-07 31164.926433 68612.535208 5105.947060 50644.203835 51907.009928 52787.590530 50049.162425 41863.096628 42517.066493
3 2020-09-08 31387.784245 70067.707666 5160.242642 50829.906350 52224.599005 53204.845544 50074.934201 42841.463228 43548.107767
4 2020-09-09 31610.642056 71539.370934 5214.824744 51015.608865 52543.870004 53605.806111 50063.043191 43800.309263 44525.070332

CASOS ACTIVOS

Modelo ARIMA (Usando Auto-ARIMA)

In [111]:
model_train=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
y_pred=valid.copy()
In [112]:
model_arima= auto_arima(model_train["Acum_Activos"],trace=True, error_action='ignore', start_p=1,start_q=1,max_p=3,max_q=3,
                   suppress_warnings=True,stepwise=False,seasonal=False)
model_arima.fit(model_train["Acum_Activos"])
 ARIMA(0,1,0)(0,0,0)[0] intercept   : AIC=2575.188, Time=0.02 sec
 ARIMA(0,1,1)(0,0,0)[0] intercept   : AIC=2479.029, Time=0.18 sec
 ARIMA(0,1,2)(0,0,0)[0] intercept   : AIC=2408.499, Time=0.42 sec
 ARIMA(0,1,3)(0,0,0)[0] intercept   : AIC=2382.933, Time=0.75 sec
 ARIMA(1,1,0)(0,0,0)[0] intercept   : AIC=2338.725, Time=0.12 sec
 ARIMA(1,1,1)(0,0,0)[0] intercept   : AIC=2298.766, Time=0.22 sec
 ARIMA(1,1,2)(0,0,0)[0] intercept   : AIC=2298.761, Time=0.39 sec
 ARIMA(1,1,3)(0,0,0)[0] intercept   : AIC=2300.761, Time=0.47 sec
 ARIMA(2,1,0)(0,0,0)[0] intercept   : AIC=2301.995, Time=0.14 sec
 ARIMA(2,1,1)(0,0,0)[0] intercept   : AIC=2298.734, Time=0.37 sec
 ARIMA(2,1,2)(0,0,0)[0] intercept   : AIC=2294.641, Time=0.57 sec
 ARIMA(2,1,3)(0,0,0)[0] intercept   : AIC=2296.630, Time=0.63 sec
 ARIMA(3,1,0)(0,0,0)[0] intercept   : AIC=2300.534, Time=0.30 sec
 ARIMA(3,1,1)(0,0,0)[0] intercept   : AIC=2300.720, Time=0.36 sec
 ARIMA(3,1,2)(0,0,0)[0] intercept   : AIC=2296.633, Time=0.74 sec
Total fit time: 5.697 seconds
Out[112]:
ARIMA(order=(2, 1, 2), scoring_args={}, suppress_warnings=True)
In [113]:
prediction_arima=model_arima.predict(len(valid))
y_pred["ARIMA Model Prediction"]=prediction_arima
In [114]:
model_scores.append(np.sqrt(mean_squared_error(valid["Acum_Activos"],prediction_arima)))
print("Error Cuadrático Medio Modelo ARIMA: ",np.sqrt(mean_squared_error(valid["Acum_Activos"],prediction_arima)))
Error Cuadrático Medio Modelo ARIMA:  1305.6348515803134
In [115]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=model_train.index, y=model_train["Acum_Activos"],
                    mode='lines+markers',name="Datos de entrenamiento para casos activos"))
fig.add_trace(go.Scatter(x=valid.index, y=valid["Acum_Activos"],
                    mode='lines+markers',name="Datos de validación para datos activos",))
fig.add_trace(go.Scatter(x=valid.index, y=y_pred["ARIMA Model Prediction"],
                    mode='lines+markers',name="Predicción de casos activos",))
fig.update_layout(title="Predicción de casos activos con el modelo ARIMA de Medellín",
                 xaxis_title="Fecha",yaxis_title="Acum_muertos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [116]:
ARIMA_model_new_prediction=[]
for i in range(1,18):
    ARIMA_model_new_prediction.append(model_arima.predict(len(valid)+i)[-1])
In [117]:
pd.DataFrame(zip(new_date,ARIMA_model_new_prediction),columns=["Activos","Predicción Modelo ARIMA"]).head()
Out[117]:
Activos Predicción Modelo ARIMA
0 2020-09-05 11695.286917
1 2020-09-06 11263.709532
2 2020-09-07 10928.100336
3 2020-09-08 10518.185852
4 2020-09-09 10197.971085

Modelo Prophet

In [118]:
prophet_c=Prophet(interval_width=0.75,weekly_seasonality=True,)
prophet_confirmed=pd.DataFrame(zip(list(df_Nuevo.index),list(df_Nuevo["Acum_Activos"])),columns=['ds','y'])
In [119]:
prophet_c.fit(prophet_confirmed)
INFO:fbprophet:Disabling yearly seasonality. Run prophet with yearly_seasonality=True to override this.
INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.
Out[119]:
<fbprophet.forecaster.Prophet at 0x1c229053a88>
In [120]:
forecast_c=prophet_c.make_future_dataframe(periods=17)
forecast_confirmed=forecast_c.copy()
In [121]:
confirmed_forecast=prophet_c.predict(forecast_c)
In [122]:
model_scores.append(np.sqrt(mean_squared_error(df_Nuevo["Acum_Activos"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
print("Error Cuadrático Medio Modelo Prophet: ",np.sqrt(mean_squared_error(df_Nuevo["Acum_Activos"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
Error Cuadrático Medio Modelo Prophet:  3793.769429788904
In [123]:
print(prophet_c.plot(confirmed_forecast))
Figure(720x432)
In [124]:
print(prophet_c.plot_components(confirmed_forecast))
Figure(648x432)

CALI

In [125]:
# Se filtra por la ciudad de interés
nombre='Cali'
x=dfCovid[dfCovid['Ciudad de ubicación']==nombre].sort_values(by='Fecha de muerte',ascending=False)
x=x[['ID de caso','atención','fecha reporte web','Fecha de muerte','Fecha de notificación','Fecha diagnostico','Fecha recuperado']]
x
Out[125]:
ID de caso atención fecha reporte web Fecha de muerte Fecha de notificación Fecha diagnostico Fecha recuperado
629161 629202 Fallecido 2020-09-02 2020-09-04 2020-08-21 2020-09-01 NaT
468588 468629 Fallecido 2020-08-17 2020-09-04 2020-08-14 2020-08-16 NaT
593598 593639 Fallecido 2020-08-29 2020-09-03 2020-08-27 2020-08-28 NaT
469259 469300 Fallecido 2020-08-17 2020-09-03 2020-08-13 2020-08-14 NaT
522873 522914 Fallecido 2020-08-22 2020-09-03 2020-08-19 2020-08-21 NaT
... ... ... ... ... ... ... ...
649668 649709 Casa 2020-09-04 NaT 2020-08-23 2020-09-03 NaT
649741 649782 Casa 2020-09-04 NaT 2020-08-22 2020-09-02 NaT
649791 649832 Casa 2020-09-04 NaT 2020-08-23 2020-09-03 NaT
649793 649834 Casa 2020-09-04 NaT 2020-08-23 2020-09-03 NaT
649810 649851 Casa 2020-09-04 NaT 2020-08-23 2020-09-03 NaT

38466 rows × 7 columns

In [126]:
# Se construye el Data Set Covid-19

#Conteo de muertos
m=x[x['atención']=='Fallecido'].groupby('Fecha de muerte').count()
m=pd.DataFrame({'Fecha':m.index.values,'Muertos':[n for n in m.values[:,0]]})

#Conteo de Confirmados
c=x.groupby('Fecha de notificación').count()
c=pd.DataFrame({'Fecha':c.index.values,'Confirmados':[n for n in c.values[:,0]]})

#Conteo Recuperados
r=x.groupby('Fecha recuperado').count()
r=pd.DataFrame({'Fecha':r.index.values,'Recuperados':[n for n in r.values[:,0]]})

df_Nuevo=pd.concat([dfCovid_Nuevo,c,m,r])
df_Nuevo.sort_values(by='Fecha',ascending=True)
df_Nuevo=df_Nuevo.groupby('Fecha').sum().sort_values(by='Fecha',ascending=True)

def acum(df,Col):
  m=df[Col].values
  d=0
  L=[]
  for n in m:
    d=d+n
    L.append(d)
  return L

df_Nuevo['Acum_muertos']=acum(df_Nuevo,'Muertos')
df_Nuevo['Acum_confirmados']=acum(df_Nuevo,'Confirmados')
df_Nuevo['Acum_Recuperados']=acum(df_Nuevo,'Recuperados')
df_Nuevo['Acum_Activos']=df_Nuevo['Acum_confirmados']-df_Nuevo['Acum_Recuperados']-df_Nuevo['Acum_muertos']
df_Nuevo
Out[126]:
Muertos Confirmados Recuperados Acum_muertos Acum_confirmados Acum_Recuperados Acum_Activos
Fecha
2020-03-02 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
2020-03-03 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
2020-03-04 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
2020-03-05 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
2020-03-06 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
... ... ... ... ... ... ... ...
2020-08-31 18.000000 170.000000 471.000000 1301.000000 38227.000000 28861.000000 8065.000000
2020-09-01 16.000000 102.000000 604.000000 1317.000000 38329.000000 29465.000000 7547.000000
2020-09-02 8.000000 127.000000 679.000000 1325.000000 38456.000000 30144.000000 6987.000000
2020-09-03 10.000000 10.000000 497.000000 1335.000000 38466.000000 30641.000000 6490.000000
2020-09-04 2.000000 0.000000 296.000000 1337.000000 38466.000000 30937.000000 6192.000000

187 rows × 7 columns

ANÁLISIS EXPLORATORIO DE DATOS

In [127]:
print("Estructura del dataset: ",df_Nuevo.shape)
print("Variables con valores nulos",df_Nuevo.isnull().sum())
print("Tipo de variables del dataset",df_Nuevo.dtypes)
Estructura del dataset:  (187, 7)
Variables con valores nulos Muertos             0
Confirmados         0
Recuperados         0
Acum_muertos        0
Acum_confirmados    0
Acum_Recuperados    0
Acum_Activos        0
dtype: int64
Tipo de variables del dataset Muertos             float64
Confirmados         float64
Recuperados         float64
Acum_muertos        float64
Acum_confirmados    float64
Acum_Recuperados    float64
Acum_Activos        float64
dtype: object
In [128]:
print("Información Básica")
df_Nuevo.iloc(0)[-1]
Información Básica
Out[128]:
Muertos                2.000000
Confirmados            0.000000
Recuperados          296.000000
Acum_muertos        1337.000000
Acum_confirmados   38466.000000
Acum_Recuperados   30937.000000
Acum_Activos        6192.000000
Name: 2020-09-04 00:00:00, dtype: float64
In [129]:
fig=px.bar(x=df_Nuevo.index,y=df_Nuevo["Acum_Activos"])
fig.update_layout(title="Distribución del número de casos activos en Cali ",
                  xaxis_title="Fecha",yaxis_title="Número de casos en Cali",)
fig.show()
In [130]:
fig=px.bar(x=df_Nuevo.index,y=df_Nuevo["Acum_Recuperados"]+df_Nuevo["Acum_muertos"])
fig.update_layout(title="Distribución del número de casos cerrados en Cali",
                  xaxis_title="Fecha",yaxis_title="Número de casos en Cali")
fig.show()
In [131]:
df_Nuevo["WeekOfYear"]=df_Nuevo.index.weekofyear

week_num=[]
weekwise_confirmed=[]
weekwise_recovered=[]
weekwise_deaths=[]
weekwise_active=[]
w=1
for i in list(df_Nuevo["WeekOfYear"].unique()):
    weekwise_confirmed.append(df_Nuevo[df_Nuevo["WeekOfYear"]==i]["Acum_confirmados"].iloc[-1])
    weekwise_recovered.append(df_Nuevo[df_Nuevo["WeekOfYear"]==i]["Acum_Recuperados"].iloc[-1])
    weekwise_deaths.append(df_Nuevo[df_Nuevo["WeekOfYear"]==i]["Acum_muertos"].iloc[-1])
    weekwise_active.append(df_Nuevo[df_Nuevo["WeekOfYear"]==i]["Acum_Activos"].iloc[-1])
    week_num.append(w)
    w=w+1

fig=go.Figure()
fig.add_trace(go.Scatter(x=week_num, y=weekwise_confirmed,
                    mode='lines+markers',
                    name='Crecimiento semanal de los casos confirmados'))
fig.add_trace(go.Scatter(x=week_num, y=weekwise_recovered,
                    mode='lines+markers',
                    name='Crecimiento semanal de los casos recuperados'))
fig.add_trace(go.Scatter(x=week_num, y=weekwise_deaths,
                    mode='lines+markers',
                    name='Crecimiento semanal de los casos de muerte'))
fig.add_trace(go.Scatter(x=week_num, y=weekwise_active,
                    mode='lines+markers',
                    name='Crecimiento semanal de los casos Activos'))
fig.update_layout(title="Crecimiento semanal de diferentes tipos de casos en Cali",
                 xaxis_title="Número de semanas",yaxis_title="Número de casos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [132]:
fig, (ax1,ax2) = plt.subplots(1, 2,figsize=(15,5))
sns.barplot(x=week_num,y=pd.Series(weekwise_confirmed).diff().fillna(0),ax=ax1)
sns.barplot(x=week_num,y=pd.Series(weekwise_deaths).diff().fillna(0),ax=ax2)
ax1.set_xlabel("Número de semanas")
ax2.set_xlabel("Número de semanas")
ax1.set_ylabel("Número de casos confirmados")
ax2.set_ylabel("Número de casos de fallecidos")
ax1.set_title("Aumento semanal del número de casos confirmados en Cali")
ax2.set_title("Aumento semanal del número de casos de muerte en Cali")
Out[132]:
Text(0.5, 1.0, 'Aumento semanal del número de casos de muerte en Cali')

Tasa de crecimiento de los casos confirmados, recuperados y de muerte

In [133]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_confirmados"],
                    mode='lines+markers',
                    name='Casos confirmados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Recuperados"],
                    mode='lines+markers',
                    name='Casos Recuperados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_muertos"],
                    mode='lines+markers',
                    name='Casos de muertes'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Activos"],
                    mode='lines+markers',
                    name='Casos Activos'))
fig.update_layout(title="Crecimiento de los diferentes tipos de casos en Cali",
                 xaxis_title="Fecha",yaxis_title="Número de casos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()

Análisis de la tasa de moralidad y recuperación

In [134]:
df_Nuevo["Tasa de mortalidad"]=(df_Nuevo["Acum_muertos"]/df_Nuevo["Acum_confirmados"])*100
df_Nuevo["Tasa de Recuperacion"]=(df_Nuevo["Acum_Recuperados"]/df_Nuevo["Acum_confirmados"])*100
df_Nuevo["Casos Cerrados"]=df_Nuevo["Acum_Recuperados"]+df_Nuevo["Acum_muertos"]

print("Tasa de mortalidad media",df_Nuevo["Tasa de mortalidad"].mean())
print("Tasa de mortalidad media",df_Nuevo["Tasa de mortalidad"].median())
print("Promedio de la tasa de recuperación",df_Nuevo["Tasa de Recuperacion"].mean())
print("Tasa de recuperación media",df_Nuevo["Tasa de Recuperacion"].median())

#Plotting Mortality and Recovery Rate 
fig = make_subplots(rows=2, cols=1,
                   subplot_titles=("Tasa de Recuperacion", "Tasa de mortalidad"))
fig.add_trace(
    go.Scatter(x=df_Nuevo.index, y=(df_Nuevo["Acum_Recuperados"]/df_Nuevo["Acum_confirmados"])*100,name="Tasa de Recuperacion"),
    row=1, col=1
)
fig.add_trace(
    go.Scatter(x=df_Nuevo.index, y=(df_Nuevo["Acum_muertos"]/df_Nuevo["Acum_confirmados"])*100,name="Tasa de mortalidad"),
    row=2, col=1
)
fig.update_layout(height=1000,legend=dict(x=-0.1,y=1.2,traceorder="normal"))
fig.update_xaxes(title_text="Fecha", row=1, col=1)
fig.update_yaxes(title_text="Tasa de Recuperacion en Cali", row=1, col=1)
fig.update_xaxes(title_text="Fecha", row=1, col=2)
fig.update_yaxes(title_text="Tasa de mortalidad en Cali", row=1, col=2)
fig.show()
Tasa de mortalidad media 3.120282438247739
Tasa de mortalidad media 3.203578092317931
Promedio de la tasa de recuperación 31.22393820295807
Tasa de recuperación media 31.784247007948284
In [135]:
print("Aumento medio del número de casos confirmados cada día en Cali: ",np.round(df_Nuevo["Acum_confirmados"].diff().fillna(0).mean()))
print("Aumento medio del número de casos recuperados cada día en Cali: ",np.round(df_Nuevo["Acum_Recuperados"].diff().fillna(0).mean()))
print("Aumento promedio del número de casos de muerte cada día en Cali: ",np.round(df_Nuevo["Acum_muertos"].diff().fillna(0).mean()))
print("Aumento promedio del número de casos de activos cada día en Cali: ",np.round(df_Nuevo["Acum_Activos"].diff().fillna(0).mean()))

fig=go.Figure()
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_confirmados"].diff().fillna(0),mode='lines+markers',
                    name='Casos de confirmados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Recuperados"].diff().fillna(0),mode='lines+markers',
                    name='Casos de recuperados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_muertos"].diff().fillna(0),mode='lines+markers',
                    name='Casos de Muerte'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Activos"].diff().fillna(0),mode='lines+markers',
                    name='Casos Activos'))
fig.update_layout(title="Aumento diario de los diferentes tipos de casos en Cali",
                 xaxis_title="Fecha",yaxis_title="Número de casos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
Aumento medio del número de casos confirmados cada día en Cali:  206.0
Aumento medio del número de casos recuperados cada día en Cali:  165.0
Aumento promedio del número de casos de muerte cada día en Cali:  7.0
Aumento promedio del número de casos de activos cada día en Cali:  33.0
In [136]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_confirmados"].diff().rolling(window=7).mean(),mode='lines+markers',
                    name='Casos Confirmados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Recuperados"].diff().rolling(window=7).mean(),mode='lines+markers',
                    name='Casos Recuperados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_muertos"].diff().rolling(window=7).mean(),mode='lines+markers',
                    name='Casos Fallecidos'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Activos"].diff().rolling(window=7).mean(),mode='lines+markers',
                    name='Casos Activos'))
fig.update_layout(title="Media móvil por cada 7 días de los casos confirmados, recuperados y de muerte en Cali",
                 xaxis_title="Fecha",yaxis_title="Número de casos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [137]:
print("Promedio de crecimiento medio del número de casos confirmados en Cali: ",(df_Nuevo["Acum_confirmados"]/df_Nuevo["Acum_confirmados"].shift()).mean())
print("Mediana de crecimiento medio del número de casos confirmados en Cali: ",(df_Nuevo["Acum_confirmados"]/df_Nuevo["Acum_confirmados"].shift()).median())
print("Promedio de crecimiento medio del número de casos recuperados en Cali: ",(df_Nuevo["Acum_Recuperados"]/df_Nuevo["Acum_Recuperados"].shift()).mean())
print("Mediana de crecimiento medio del número de casos recuperados en Cali: ",(df_Nuevo["Acum_Recuperados"]/df_Nuevo["Acum_Recuperados"].shift()).median())
print("Promedio de crecimiento medio del número de casos de muerte en Cali: ",(df_Nuevo["Acum_muertos"]/df_Nuevo["Acum_muertos"].shift()).mean())
print("Mediana de crecimiento medio del número de casos de muerte en Cali: ",(df_Nuevo["Acum_muertos"]/df_Nuevo["Acum_muertos"].shift()).median())

fig=go.Figure()
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_confirmados"]/df_Nuevo["Acum_confirmados"].shift(),
                    mode='lines',
                    name='Factor de crecimiento de los casos confirmados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Recuperados"]/df_Nuevo["Acum_Recuperados"].shift(),
                    mode='lines',
                    name='Factor de crecimiento de los casos recuperados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_muertos"]/df_Nuevo["Acum_muertos"].shift(),
                    mode='lines',
                    name='Factor de crecimiento de los casos de muerte'))
fig.update_layout(title="Factor de crecimiento en función de la fecha de los diferentes tipos de casos en Cali",
                 xaxis_title="Fecha",yaxis_title="Factor de crecimiento",
                 legend=dict(x=0,y=-0.4,traceorder="normal"))
fig.show()
Promedio de crecimiento medio del número de casos confirmados en Cali:  inf
Mediana de crecimiento medio del número de casos confirmados en Cali:  1.0336010659578365
Promedio de crecimiento medio del número de casos recuperados en Cali:  inf
Mediana de crecimiento medio del número de casos recuperados en Cali:  1.039639250873428
Promedio de crecimiento medio del número de casos de muerte en Cali:  inf
Mediana de crecimiento medio del número de casos de muerte en Cali:  1.026432231020028

MODELOS DE PREDICCIÓN CALI

CASOS CONFIRMADOS

Modelo ARIMA (Usando Auto-ARIMA)

In [138]:
model_train=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
y_pred=valid.copy()
In [139]:
model_arima= auto_arima(model_train["Acum_confirmados"],trace=True, error_action='ignore', start_p=1,start_q=1,max_p=3,max_q=3,
                   suppress_warnings=True,stepwise=False,seasonal=False)
model_arima.fit(model_train["Acum_confirmados"])
 ARIMA(0,2,0)(0,0,0)[0] intercept   : AIC=2312.980, Time=0.02 sec
 ARIMA(0,2,1)(0,0,0)[0] intercept   : AIC=2231.982, Time=0.16 sec
 ARIMA(0,2,2)(0,0,0)[0] intercept   : AIC=2233.662, Time=0.27 sec
 ARIMA(0,2,3)(0,0,0)[0] intercept   : AIC=2228.999, Time=0.39 sec
 ARIMA(1,2,0)(0,0,0)[0] intercept   : AIC=2286.772, Time=0.12 sec
 ARIMA(1,2,1)(0,0,0)[0] intercept   : AIC=2233.806, Time=0.28 sec
 ARIMA(1,2,2)(0,0,0)[0] intercept   : AIC=2235.668, Time=0.40 sec
 ARIMA(1,2,3)(0,0,0)[0] intercept   : AIC=2228.593, Time=0.58 sec
 ARIMA(2,2,0)(0,0,0)[0] intercept   : AIC=2249.204, Time=0.08 sec
 ARIMA(2,2,1)(0,0,0)[0] intercept   : AIC=2228.412, Time=0.40 sec
 ARIMA(2,2,2)(0,0,0)[0] intercept   : AIC=2230.234, Time=0.59 sec
 ARIMA(2,2,3)(0,0,0)[0] intercept   : AIC=2218.639, Time=0.75 sec
 ARIMA(3,2,0)(0,0,0)[0] intercept   : AIC=2239.569, Time=0.24 sec
 ARIMA(3,2,1)(0,0,0)[0] intercept   : AIC=2230.134, Time=0.56 sec
 ARIMA(3,2,2)(0,0,0)[0] intercept   : AIC=2226.957, Time=0.50 sec
Total fit time: 5.382 seconds
Out[139]:
ARIMA(order=(2, 2, 3), scoring_args={}, suppress_warnings=True)
In [140]:
prediction_arima=model_arima.predict(len(valid))
y_pred["ARIMA Model Prediction"]=prediction_arima
In [141]:
model_scores.append(np.sqrt(mean_squared_error(valid["Acum_confirmados"],prediction_arima)))
print("Error Cuadrático Medio Modelo ARIMA: ",np.sqrt(mean_squared_error(valid["Acum_confirmados"],prediction_arima)))
Error Cuadrático Medio Modelo ARIMA:  1001.3276591083523
In [142]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=model_train.index, y=model_train["Acum_confirmados"],
                    mode='lines+markers',name="Datos de entrenamiento para casos confirmados"))
fig.add_trace(go.Scatter(x=valid.index, y=valid["Acum_confirmados"],
                    mode='lines+markers',name="Datos de validación para datos confirmados",))
fig.add_trace(go.Scatter(x=valid.index, y=y_pred["ARIMA Model Prediction"],
                    mode='lines+markers',name="Predicción de casos confirmados",))
fig.update_layout(title="Predicción de casos confirmados con el modelo ARIMA de Cali",
                 xaxis_title="Fecha",yaxis_title="Acum_confirmados",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [143]:
ARIMA_model_new_prediction=[]
for i in range(1,18):
    ARIMA_model_new_prediction.append(model_arima.predict(len(valid)+i)[-1])
pd.DataFrame(zip(new_date,ARIMA_model_new_prediction),columns=["Confirmados","Predicción Modelo ARIMA"]).head()
Out[143]:
Confirmados Predicción Modelo ARIMA
0 2020-09-05 40633.554259
1 2020-09-06 40907.355322
2 2020-09-07 41271.772473
3 2020-09-08 41686.623113
4 2020-09-09 41995.348530

Modelo Prophet

In [144]:
prophet_c=Prophet(interval_width=0.75,weekly_seasonality=True,)
prophet_confirmed=pd.DataFrame(zip(list(df_Nuevo.index),list(df_Nuevo["Acum_confirmados"])),columns=['ds','y'])
In [145]:
prophet_c.fit(prophet_confirmed)
INFO:fbprophet:Disabling yearly seasonality. Run prophet with yearly_seasonality=True to override this.
INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.
Out[145]:
<fbprophet.forecaster.Prophet at 0x1c22a20d108>
In [146]:
forecast_c=prophet_c.make_future_dataframe(periods=17)
forecast_confirmed=forecast_c.copy()
In [147]:
confirmed_forecast=prophet_c.predict(forecast_c)
In [148]:
model_scores.append(np.sqrt(mean_squared_error(df_Nuevo["Acum_confirmados"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
print("Error Cuadrático Medio Modelo Prophet: ",np.sqrt(mean_squared_error(df_Nuevo["Acum_confirmados"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
Error Cuadrático Medio Modelo Prophet:  539.1225784218649
In [149]:
print(prophet_c.plot(confirmed_forecast))
Figure(720x432)
In [150]:
print(prophet_c.plot_components(confirmed_forecast))
Figure(648x432)

CASOS FALLECIDOS

Modelo ARIMA (Usando Auto-ARIMA)

In [151]:
model_train=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
y_pred=valid.copy()
In [152]:
model_arima= auto_arima(model_train["Acum_muertos"],trace=True, error_action='ignore', start_p=1,start_q=1,max_p=3,max_q=3,
                   suppress_warnings=True,stepwise=False,seasonal=False)
model_arima.fit(model_train["Acum_muertos"])
 ARIMA(0,2,0)(0,0,0)[0] intercept   : AIC=924.618, Time=0.02 sec
 ARIMA(0,2,1)(0,0,0)[0] intercept   : AIC=846.009, Time=0.10 sec
 ARIMA(0,2,2)(0,0,0)[0] intercept   : AIC=843.479, Time=0.12 sec
 ARIMA(0,2,3)(0,0,0)[0] intercept   : AIC=843.462, Time=0.14 sec
 ARIMA(1,2,0)(0,0,0)[0] intercept   : AIC=851.197, Time=0.06 sec
 ARIMA(1,2,1)(0,0,0)[0] intercept   : AIC=841.995, Time=0.13 sec
 ARIMA(1,2,2)(0,0,0)[0] intercept   : AIC=843.069, Time=0.21 sec
 ARIMA(1,2,3)(0,0,0)[0] intercept   : AIC=844.845, Time=0.32 sec
 ARIMA(2,2,0)(0,0,0)[0] intercept   : AIC=846.397, Time=0.09 sec
 ARIMA(2,2,1)(0,0,0)[0] intercept   : AIC=842.997, Time=0.19 sec
 ARIMA(2,2,2)(0,0,0)[0] intercept   : AIC=844.915, Time=0.30 sec
 ARIMA(2,2,3)(0,0,0)[0] intercept   : AIC=845.349, Time=0.95 sec
 ARIMA(3,2,0)(0,0,0)[0] intercept   : AIC=845.269, Time=0.13 sec
 ARIMA(3,2,1)(0,0,0)[0] intercept   : AIC=844.850, Time=0.19 sec
 ARIMA(3,2,2)(0,0,0)[0] intercept   : AIC=845.549, Time=0.40 sec
Total fit time: 3.362 seconds
Out[152]:
ARIMA(order=(1, 2, 1), scoring_args={}, suppress_warnings=True)
In [153]:
prediction_arima=model_arima.predict(len(valid))
y_pred["ARIMA Model Prediction"]=prediction_arima
In [154]:
model_scores.append(np.sqrt(mean_squared_error(valid["Acum_muertos"],prediction_arima)))
print("Error Cuadrático Medio Modelo ARIMA: ",np.sqrt(mean_squared_error(valid["Acum_muertos"],prediction_arima)))
Error Cuadrático Medio Modelo ARIMA:  13.191128076799677
In [155]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=model_train.index, y=model_train["Acum_muertos"],
                    mode='lines+markers',name="Datos de entrenamiento para casos fallecidos"))
fig.add_trace(go.Scatter(x=valid.index, y=valid["Acum_muertos"],
                    mode='lines+markers',name="Datos de validación para datos fallecidos",))
fig.add_trace(go.Scatter(x=valid.index, y=y_pred["ARIMA Model Prediction"],
                    mode='lines+markers',name="Predicción de casos fallecidos",))
fig.update_layout(title="Predicción de casos fallecidos con el modelo ARIMA de Cali",
                 xaxis_title="Fecha",yaxis_title="Acum_muertos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [156]:
ARIMA_model_new_prediction=[]
for i in range(1,18):
    ARIMA_model_new_prediction.append(model_arima.predict(len(valid)+i)[-1])
pd.DataFrame(zip(new_date,ARIMA_model_new_prediction),columns=["Fallecidos","Predicción Modelo ARIMA"]).head()
Out[156]:
Fallecidos Predicción Modelo ARIMA
0 2020-09-05 1348.440310
1 2020-09-06 1361.659713
2 2020-09-07 1374.950224
3 2020-09-08 1388.311852
4 2020-09-09 1401.744596

Modelo Prophet

In [157]:
prophet_c=Prophet(interval_width=0.75,weekly_seasonality=True,)
prophet_confirmed=pd.DataFrame(zip(list(df_Nuevo.index),list(df_Nuevo["Acum_muertos"])),columns=['ds','y'])
In [158]:
prophet_c.fit(prophet_confirmed)
INFO:fbprophet:Disabling yearly seasonality. Run prophet with yearly_seasonality=True to override this.
INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.
Out[158]:
<fbprophet.forecaster.Prophet at 0x1c22a2eec88>
In [159]:
forecast_c=prophet_c.make_future_dataframe(periods=17)
forecast_confirmed=forecast_c.copy()
In [160]:
confirmed_forecast=prophet_c.predict(forecast_c)
In [161]:
model_scores.append(np.sqrt(mean_squared_error(df_Nuevo["Acum_muertos"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
print("Error Cuadrático Medio Modelo Prophet: ",np.sqrt(mean_squared_error(df_Nuevo["Acum_muertos"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
Error Cuadrático Medio Modelo Prophet:  9.782454514065781
In [162]:
print(prophet_c.plot(confirmed_forecast))
Figure(720x432)
In [163]:
print(prophet_c.plot_components(confirmed_forecast))
Figure(648x432)

CASOS RECUPERADOS

Modelo ARIMA (Usando Auto-ARIMA)

In [164]:
model_train=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
y_pred=valid.copy()
In [165]:
model_arima= auto_arima(model_train["Acum_Recuperados"],trace=True, error_action='ignore', start_p=1,start_q=1,max_p=3,max_q=3,
                   suppress_warnings=True,stepwise=False,seasonal=False)
model_arima.fit(model_train["Acum_Recuperados"])
 ARIMA(0,2,0)(0,0,0)[0] intercept   : AIC=2280.330, Time=0.02 sec
 ARIMA(0,2,1)(0,0,0)[0] intercept   : AIC=2220.596, Time=0.14 sec
 ARIMA(0,2,2)(0,0,0)[0] intercept   : AIC=2220.200, Time=0.37 sec
 ARIMA(0,2,3)(0,0,0)[0] intercept   : AIC=2201.606, Time=0.47 sec
 ARIMA(1,2,0)(0,0,0)[0] intercept   : AIC=2231.435, Time=0.14 sec
 ARIMA(1,2,1)(0,0,0)[0] intercept   : AIC=2218.586, Time=0.48 sec
 ARIMA(1,2,2)(0,0,0)[0] intercept   : AIC=2224.468, Time=0.38 sec
 ARIMA(1,2,3)(0,0,0)[0] intercept   : AIC=2200.395, Time=0.62 sec
 ARIMA(2,2,0)(0,0,0)[0] intercept   : AIC=2233.431, Time=0.18 sec
 ARIMA(2,2,1)(0,0,0)[0] intercept   : AIC=2213.883, Time=0.54 sec
 ARIMA(2,2,2)(0,0,0)[0] intercept   : AIC=2211.373, Time=0.45 sec
 ARIMA(2,2,3)(0,0,0)[0] intercept   : AIC=2201.808, Time=0.65 sec
 ARIMA(3,2,0)(0,0,0)[0] intercept   : AIC=2225.437, Time=0.23 sec
 ARIMA(3,2,1)(0,0,0)[0] intercept   : AIC=2204.627, Time=0.52 sec
 ARIMA(3,2,2)(0,0,0)[0] intercept   : AIC=2206.376, Time=0.68 sec
Total fit time: 5.896 seconds
Out[165]:
ARIMA(order=(1, 2, 3), scoring_args={}, suppress_warnings=True)
In [166]:
prediction_arima=model_arima.predict(len(valid))
y_pred["ARIMA Model Prediction"]=prediction_arima
In [167]:
model_scores.append(np.sqrt(mean_squared_error(valid["Acum_Recuperados"],prediction_arima)))
print("Error Cuadrático Medio Modelo ARIMA: ",np.sqrt(mean_squared_error(valid["Acum_Recuperados"],prediction_arima)))
Error Cuadrático Medio Modelo ARIMA:  542.323796756834
In [168]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=model_train.index, y=model_train["Acum_Recuperados"],
                    mode='lines+markers',name="Datos de entrenamiento para casos recuperados"))
fig.add_trace(go.Scatter(x=valid.index, y=valid["Acum_Recuperados"],
                    mode='lines+markers',name="Datos de validación para datos recuperados",))
fig.add_trace(go.Scatter(x=valid.index, y=y_pred["ARIMA Model Prediction"],
                    mode='lines+markers',name="Predicción de casos recuperados",))
fig.update_layout(title="Predicción de casos recuperados con el modelo ARIMA de Cali",
                 xaxis_title="Fecha",yaxis_title="Acum_Recuperados",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [169]:
ARIMA_model_new_prediction=[]
for i in range(1,18):
    ARIMA_model_new_prediction.append(model_arima.predict(len(valid)+i)[-1])
pd.DataFrame(zip(new_date,ARIMA_model_new_prediction),columns=["Recuperados","Predicción Modelo ARIMA"]).head()
Out[169]:
Recuperados Predicción Modelo ARIMA
0 2020-09-05 32717.768990
1 2020-09-06 33420.277361
2 2020-09-07 34126.675818
3 2020-09-08 34836.970980
4 2020-09-09 35551.160656

Modelo Prophet

In [170]:
prophet_c=Prophet(interval_width=0.75,weekly_seasonality=True,)
prophet_confirmed=pd.DataFrame(zip(list(df_Nuevo.index),list(df_Nuevo["Acum_Recuperados"])),columns=['ds','y'])
In [171]:
prophet_c.fit(prophet_confirmed)
INFO:fbprophet:Disabling yearly seasonality. Run prophet with yearly_seasonality=True to override this.
INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.
Out[171]:
<fbprophet.forecaster.Prophet at 0x1c22b0bb208>
In [172]:
forecast_c=prophet_c.make_future_dataframe(periods=17)
forecast_confirmed=forecast_c.copy()
In [173]:
confirmed_forecast=prophet_c.predict(forecast_c)
In [174]:
model_scores.append(np.sqrt(mean_squared_error(df_Nuevo["Acum_Recuperados"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
print("Error Cuadrático Medio Modelo Prophet: ",np.sqrt(mean_squared_error(df_Nuevo["Acum_Recuperados"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
Error Cuadrático Medio Modelo Prophet:  340.1279949357659
In [175]:
print(prophet_c.plot(confirmed_forecast))
Figure(720x432)
In [176]:
print(prophet_c.plot_components(confirmed_forecast))
Figure(648x432)

CASOS ACTIVOS

Modelo ARIMA (Usando Auto-ARIMA)

In [177]:
model_train=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
y_pred=valid.copy()
In [178]:
model_arima= auto_arima(model_train["Acum_Activos"],trace=True, error_action='ignore', start_p=1,start_q=1,max_p=3,max_q=3,
                   suppress_warnings=True,stepwise=False,seasonal=False)
model_arima.fit(model_train["Acum_Activos"])
 ARIMA(0,1,0)(0,0,0)[0] intercept   : AIC=2441.313, Time=0.02 sec
 ARIMA(0,1,1)(0,0,0)[0] intercept   : AIC=2410.924, Time=0.15 sec
 ARIMA(0,1,2)(0,0,0)[0] intercept   : AIC=2400.440, Time=0.20 sec
 ARIMA(0,1,3)(0,0,0)[0] intercept   : AIC=2394.462, Time=0.27 sec
 ARIMA(1,1,0)(0,0,0)[0] intercept   : AIC=2392.683, Time=0.06 sec
 ARIMA(1,1,1)(0,0,0)[0] intercept   : AIC=2376.024, Time=0.35 sec
 ARIMA(1,1,2)(0,0,0)[0] intercept   : AIC=2376.140, Time=0.34 sec
 ARIMA(1,1,3)(0,0,0)[0] intercept   : AIC=2377.981, Time=0.63 sec
 ARIMA(2,1,0)(0,0,0)[0] intercept   : AIC=2385.729, Time=0.07 sec
 ARIMA(2,1,1)(0,0,0)[0] intercept   : AIC=2376.063, Time=0.46 sec
 ARIMA(2,1,2)(0,0,0)[0] intercept   : AIC=2378.062, Time=0.61 sec
 ARIMA(2,1,3)(0,0,0)[0] intercept   : AIC=2376.484, Time=0.86 sec
 ARIMA(3,1,0)(0,0,0)[0] intercept   : AIC=2385.150, Time=0.25 sec
 ARIMA(3,1,1)(0,0,0)[0] intercept   : AIC=2378.062, Time=0.63 sec
 ARIMA(3,1,2)(0,0,0)[0] intercept   : AIC=2376.934, Time=0.69 sec
Total fit time: 5.596 seconds
Out[178]:
ARIMA(order=(1, 1, 1), scoring_args={}, suppress_warnings=True)
In [179]:
prediction_arima=model_arima.predict(len(valid))
y_pred["ARIMA Model Prediction"]=prediction_arima
In [180]:
model_scores.append(np.sqrt(mean_squared_error(valid["Acum_Activos"],prediction_arima)))
print("Error Cuadrático Medio Modelo ARIMA: ",np.sqrt(mean_squared_error(valid["Acum_Activos"],prediction_arima)))
Error Cuadrático Medio Modelo ARIMA:  916.955494714851
In [181]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=model_train.index, y=model_train["Acum_Activos"],
                    mode='lines+markers',name="Datos de entrenamiento para casos activos"))
fig.add_trace(go.Scatter(x=valid.index, y=valid["Acum_Activos"],
                    mode='lines+markers',name="Datos de validación para datos activos",))
fig.add_trace(go.Scatter(x=valid.index, y=y_pred["ARIMA Model Prediction"],
                    mode='lines+markers',name="Predicción de casos activos",))
fig.update_layout(title="Predicción de casos activos con el modelo ARIMA de Cali",
                 xaxis_title="Fecha",yaxis_title="Acum_muertos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [182]:
ARIMA_model_new_prediction=[]
for i in range(1,18):
    ARIMA_model_new_prediction.append(model_arima.predict(len(valid)+i)[-1])
pd.DataFrame(zip(new_date,ARIMA_model_new_prediction),columns=["Activos","Predicción Modelo ARIMA"]).head()
Out[182]:
Activos Predicción Modelo ARIMA
0 2020-09-05 7490.771928
1 2020-09-06 7298.888662
2 2020-09-07 7115.690492
3 2020-09-08 6940.809098
4 2020-09-09 6773.891784

Modelo Prophet

In [183]:
prophet_c=Prophet(interval_width=0.75,weekly_seasonality=True,)
prophet_confirmed=pd.DataFrame(zip(list(df_Nuevo.index),list(df_Nuevo["Acum_Activos"])),columns=['ds','y'])
In [184]:
prophet_c.fit(prophet_confirmed)
INFO:fbprophet:Disabling yearly seasonality. Run prophet with yearly_seasonality=True to override this.
INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.
Out[184]:
<fbprophet.forecaster.Prophet at 0x1c22a2e0708>
In [185]:
forecast_c=prophet_c.make_future_dataframe(periods=17)
forecast_confirmed=forecast_c.copy()
In [186]:
confirmed_forecast=prophet_c.predict(forecast_c)
In [187]:
model_scores.append(np.sqrt(mean_squared_error(df_Nuevo["Acum_Activos"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
print("Error Cuadrático Medio Modelo Prophet: ",np.sqrt(mean_squared_error(df_Nuevo["Acum_Activos"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
Error Cuadrático Medio Modelo Prophet:  2029.008102508068
In [188]:
print(prophet_c.plot(confirmed_forecast))
Figure(720x432)
In [189]:
print(prophet_c.plot_components(confirmed_forecast))
Figure(648x432)

BARRANQUILLA

In [190]:
# Se filtra por la ciudad de interés
nombre='Barranquilla'
x=dfCovid[dfCovid['Ciudad de ubicación']==nombre].sort_values(by='Fecha de muerte',ascending=False)
x=x[['ID de caso','atención','fecha reporte web','Fecha de muerte','Fecha de notificación','Fecha diagnostico','Fecha recuperado']]
x
Out[190]:
ID de caso atención fecha reporte web Fecha de muerte Fecha de notificación Fecha diagnostico Fecha recuperado
84654 84695 Recuperado 2020-06-27 2020-09-02 2020-06-23 2020-06-26 2020-07-24
562306 562347 Fallecido 2020-08-26 2020-09-02 2020-08-14 2020-08-25 NaT
259396 259437 Recuperado 2020-07-28 2020-09-02 2020-07-23 2020-07-27 2020-08-03
550504 550545 Fallecido 2020-08-24 2020-09-02 2020-08-11 2020-08-22 NaT
429221 429262 Fallecido 2020-08-13 2020-09-01 2020-08-12 2020-08-10 NaT
... ... ... ... ... ... ... ...
649759 649800 Casa 2020-09-04 NaT 2020-08-23 2020-09-03 NaT
649764 649805 Casa 2020-09-04 NaT 2020-08-23 2020-09-03 NaT
649767 649808 Casa 2020-09-04 NaT 2020-08-23 2020-09-03 NaT
649771 649812 Casa 2020-09-04 NaT 2020-08-23 2020-09-03 NaT
649812 649853 Casa 2020-09-04 NaT 2020-08-23 2020-09-03 NaT

36520 rows × 7 columns

In [191]:
# Se construye el Data Set Covid-19

#Conteo de muertos
m=x[x['atención']=='Fallecido'].groupby('Fecha de muerte').count()
m=pd.DataFrame({'Fecha':m.index.values,'Muertos':[n for n in m.values[:,0]]})

#Conteo de Confirmados
c=x.groupby('Fecha de notificación').count()
c=pd.DataFrame({'Fecha':c.index.values,'Confirmados':[n for n in c.values[:,0]]})

#Conteo Recuperados
r=x.groupby('Fecha recuperado').count()
r=pd.DataFrame({'Fecha':r.index.values,'Recuperados':[n for n in r.values[:,0]]})

df_Nuevo=pd.concat([dfCovid_Nuevo,c,m,r])
df_Nuevo.sort_values(by='Fecha',ascending=True)
df_Nuevo=df_Nuevo.groupby('Fecha').sum().sort_values(by='Fecha',ascending=True)

def acum(df,Col):
  m=df[Col].values
  d=0
  L=[]
  for n in m:
    d=d+n
    L.append(d)
  return L

df_Nuevo['Acum_muertos']=acum(df_Nuevo,'Muertos')
df_Nuevo['Acum_confirmados']=acum(df_Nuevo,'Confirmados')
df_Nuevo['Acum_Recuperados']=acum(df_Nuevo,'Recuperados')
df_Nuevo['Acum_Activos']=df_Nuevo['Acum_confirmados']-df_Nuevo['Acum_Recuperados']-df_Nuevo['Acum_muertos']
df_Nuevo
Out[191]:
Muertos Confirmados Recuperados Acum_muertos Acum_confirmados Acum_Recuperados Acum_Activos
Fecha
2020-03-02 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
2020-03-03 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
2020-03-04 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
2020-03-05 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
2020-03-06 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
... ... ... ... ... ... ... ...
2020-08-31 1.000000 64.000000 101.000000 1618.000000 36463.000000 32820.000000 2025.000000
2020-09-01 5.000000 21.000000 134.000000 1623.000000 36484.000000 32954.000000 1907.000000
2020-09-02 2.000000 23.000000 132.000000 1625.000000 36507.000000 33086.000000 1796.000000
2020-09-03 0.000000 12.000000 189.000000 1625.000000 36519.000000 33275.000000 1619.000000
2020-09-04 0.000000 1.000000 133.000000 1625.000000 36520.000000 33408.000000 1487.000000

187 rows × 7 columns

ANÁLISIS EXPLORATORIO DE DATOS

In [192]:
print("Estructura del dataset: ",df_Nuevo.shape)
print("Variables con valores nulos",df_Nuevo.isnull().sum())
print("Tipo de variables del dataset",df_Nuevo.dtypes)
Estructura del dataset:  (187, 7)
Variables con valores nulos Muertos             0
Confirmados         0
Recuperados         0
Acum_muertos        0
Acum_confirmados    0
Acum_Recuperados    0
Acum_Activos        0
dtype: int64
Tipo de variables del dataset Muertos             float64
Confirmados         float64
Recuperados         float64
Acum_muertos        float64
Acum_confirmados    float64
Acum_Recuperados    float64
Acum_Activos        float64
dtype: object
In [193]:
print("Información Básica")
df_Nuevo.iloc(0)[-1]
Información Básica
Out[193]:
Muertos                0.000000
Confirmados            1.000000
Recuperados          133.000000
Acum_muertos        1625.000000
Acum_confirmados   36520.000000
Acum_Recuperados   33408.000000
Acum_Activos        1487.000000
Name: 2020-09-04 00:00:00, dtype: float64
In [194]:
fig=px.bar(x=df_Nuevo.index,y=df_Nuevo["Acum_Activos"])
fig.update_layout(title="Distribución del número de casos activos en Barranquilla ",
                  xaxis_title="Fecha",yaxis_title="Número de casos en Barranquilla",)
fig.show()
In [195]:
fig=px.bar(x=df_Nuevo.index,y=df_Nuevo["Acum_Recuperados"]+df_Nuevo["Acum_muertos"])
fig.update_layout(title="Distribución del número de casos cerrados en Barranquilla",
                  xaxis_title="Fecha",yaxis_title="Número de casos en Barranquilla")
fig.show()
In [196]:
df_Nuevo["WeekOfYear"]=df_Nuevo.index.weekofyear

week_num=[]
weekwise_confirmed=[]
weekwise_recovered=[]
weekwise_deaths=[]
weekwise_active=[]
w=1
for i in list(df_Nuevo["WeekOfYear"].unique()):
    weekwise_confirmed.append(df_Nuevo[df_Nuevo["WeekOfYear"]==i]["Acum_confirmados"].iloc[-1])
    weekwise_recovered.append(df_Nuevo[df_Nuevo["WeekOfYear"]==i]["Acum_Recuperados"].iloc[-1])
    weekwise_deaths.append(df_Nuevo[df_Nuevo["WeekOfYear"]==i]["Acum_muertos"].iloc[-1])
    weekwise_active.append(df_Nuevo[df_Nuevo["WeekOfYear"]==i]["Acum_Activos"].iloc[-1])
    week_num.append(w)
    w=w+1

fig=go.Figure()
fig.add_trace(go.Scatter(x=week_num, y=weekwise_confirmed,
                    mode='lines+markers',
                    name='Crecimiento semanal de los casos confirmados'))
fig.add_trace(go.Scatter(x=week_num, y=weekwise_recovered,
                    mode='lines+markers',
                    name='Crecimiento semanal de los casos recuperados'))
fig.add_trace(go.Scatter(x=week_num, y=weekwise_deaths,
                    mode='lines+markers',
                    name='Crecimiento semanal de los casos de muerte'))
fig.add_trace(go.Scatter(x=week_num, y=weekwise_active,
                    mode='lines+markers',
                    name='Crecimiento semanal de los casos Activos'))
fig.update_layout(title="Crecimiento semanal de diferentes tipos de casos en Barranquilla",
                 xaxis_title="Número de semanas",yaxis_title="Número de casos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [197]:
fig, (ax1,ax2) = plt.subplots(1, 2,figsize=(15,5))
sns.barplot(x=week_num,y=pd.Series(weekwise_confirmed).diff().fillna(0),ax=ax1)
sns.barplot(x=week_num,y=pd.Series(weekwise_deaths).diff().fillna(0),ax=ax2)
ax1.set_xlabel("Número de semanas")
ax2.set_xlabel("Número de semanas")
ax1.set_ylabel("Número de casos confirmados")
ax2.set_ylabel("Número de casos de fallecidos")
ax1.set_title("Aumento semanal del número de casos confirmados en Barranquilla")
ax2.set_title("Aumento semanal del número de casos de muerte en Barranquilla")
Out[197]:
Text(0.5, 1.0, 'Aumento semanal del número de casos de muerte en Barranquilla')

Tasa de crecimiento de los casos confirmados, recuperados y de muerte

In [198]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_confirmados"],
                    mode='lines+markers',
                    name='Casos confirmados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Recuperados"],
                    mode='lines+markers',
                    name='Casos Recuperados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_muertos"],
                    mode='lines+markers',
                    name='Casos de muertes'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Activos"],
                    mode='lines+markers',
                    name='Casos Activos'))
fig.update_layout(title="Crecimiento de los diferentes tipos de casos en Barranquilla",
                 xaxis_title="Fecha",yaxis_title="Número de casos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()

Análisis de la tasa de moralidad y recuperación

In [199]:
df_Nuevo["Tasa de mortalidad"]=(df_Nuevo["Acum_muertos"]/df_Nuevo["Acum_confirmados"])*100
df_Nuevo["Tasa de Recuperacion"]=(df_Nuevo["Acum_Recuperados"]/df_Nuevo["Acum_confirmados"])*100
df_Nuevo["Casos Cerrados"]=df_Nuevo["Acum_Recuperados"]+df_Nuevo["Acum_muertos"]

print("Tasa de mortalidad media",df_Nuevo["Tasa de mortalidad"].mean())
print("Tasa de mortalidad media",df_Nuevo["Tasa de mortalidad"].median())
print("Promedio de la tasa de recuperación",df_Nuevo["Tasa de Recuperacion"].mean())
print("Tasa de recuperación media",df_Nuevo["Tasa de Recuperacion"].median())

#Plotting Mortality and Recovery Rate 
fig = make_subplots(rows=2, cols=1,
                   subplot_titles=("Tasa de Recuperacion", "Tasa de mortalidad"))
fig.add_trace(
    go.Scatter(x=df_Nuevo.index, y=(df_Nuevo["Acum_Recuperados"]/df_Nuevo["Acum_confirmados"])*100,name="Tasa de Recuperacion"),
    row=1, col=1
)
fig.add_trace(
    go.Scatter(x=df_Nuevo.index, y=(df_Nuevo["Acum_muertos"]/df_Nuevo["Acum_confirmados"])*100,name="Tasa de mortalidad"),
    row=2, col=1
)
fig.update_layout(height=1000,legend=dict(x=-0.1,y=1.2,traceorder="normal"))
fig.update_xaxes(title_text="Fecha", row=1, col=1)
fig.update_yaxes(title_text="Tasa de Recuperacion en Barranquilla", row=1, col=1)
fig.update_xaxes(title_text="Fecha", row=1, col=2)
fig.update_yaxes(title_text="Tasa de mortalidad en Barranquilla", row=1, col=2)
fig.show()
Tasa de mortalidad media 3.4864421749395764
Tasa de mortalidad media 4.275704275704276
Promedio de la tasa de recuperación 32.77634546437728
Tasa de recuperación media 23.60248447204969
In [200]:
print("Aumento medio del número de casos confirmados cada día en Barranquilla: ",np.round(df_Nuevo["Acum_confirmados"].diff().fillna(0).mean()))
print("Aumento medio del número de casos recuperados cada día en Barranquilla: ",np.round(df_Nuevo["Acum_Recuperados"].diff().fillna(0).mean()))
print("Aumento promedio del número de casos de muerte cada día en Barranquilla: ",np.round(df_Nuevo["Acum_muertos"].diff().fillna(0).mean()))
print("Aumento promedio del número de casos de activos cada día en Barranquilla: ",np.round(df_Nuevo["Acum_Activos"].diff().fillna(0).mean()))

fig=go.Figure()
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_confirmados"].diff().fillna(0),mode='lines+markers',
                    name='Casos de confirmados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Recuperados"].diff().fillna(0),mode='lines+markers',
                    name='Casos de recuperados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_muertos"].diff().fillna(0),mode='lines+markers',
                    name='Casos de Muerte'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Activos"].diff().fillna(0),mode='lines+markers',
                    name='Casos Activos'))
fig.update_layout(title="Aumento diario de los diferentes tipos de casos en Barranquilla",
                 xaxis_title="Fecha",yaxis_title="Número de casos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
Aumento medio del número de casos confirmados cada día en Barranquilla:  195.0
Aumento medio del número de casos recuperados cada día en Barranquilla:  179.0
Aumento promedio del número de casos de muerte cada día en Barranquilla:  9.0
Aumento promedio del número de casos de activos cada día en Barranquilla:  8.0
In [201]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_confirmados"].diff().rolling(window=7).mean(),mode='lines+markers',
                    name='Casos Confirmados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Recuperados"].diff().rolling(window=7).mean(),mode='lines+markers',
                    name='Casos Recuperados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_muertos"].diff().rolling(window=7).mean(),mode='lines+markers',
                    name='Casos Fallecidos'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Activos"].diff().rolling(window=7).mean(),mode='lines+markers',
                    name='Casos Activos'))
fig.update_layout(title="Media móvil por cada 7 días de los casos confirmados, recuperados y de muerte en Barranquilla",
                 xaxis_title="Fecha",yaxis_title="Número de casos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [202]:
print("Promedio de crecimiento medio del número de casos confirmados en Barranquilla: ",(df_Nuevo["Acum_confirmados"]/df_Nuevo["Acum_confirmados"].shift()).mean())
print("Mediana de crecimiento medio del número de casos confirmados en Barranquilla: ",(df_Nuevo["Acum_confirmados"]/df_Nuevo["Acum_confirmados"].shift()).median())
print("Promedio de crecimiento medio del número de casos recuperados en Barranquilla: ",(df_Nuevo["Acum_Recuperados"]/df_Nuevo["Acum_Recuperados"].shift()).mean())
print("Mediana de crecimiento medio del número de casos recuperados en Barranquilla: ",(df_Nuevo["Acum_Recuperados"]/df_Nuevo["Acum_Recuperados"].shift()).median())
print("Promedio de crecimiento medio del número de casos de muerte en Barranquilla: ",(df_Nuevo["Acum_muertos"]/df_Nuevo["Acum_muertos"].shift()).mean())
print("Mediana de crecimiento medio del número de casos de muerte en Barranquilla: ",(df_Nuevo["Acum_muertos"]/df_Nuevo["Acum_muertos"].shift()).median())

fig=go.Figure()
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_confirmados"]/df_Nuevo["Acum_confirmados"].shift(),
                    mode='lines',
                    name='Factor de crecimiento de los casos confirmados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Recuperados"]/df_Nuevo["Acum_Recuperados"].shift(),
                    mode='lines',
                    name='Factor de crecimiento de los casos recuperados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_muertos"]/df_Nuevo["Acum_muertos"].shift(),
                    mode='lines',
                    name='Factor de crecimiento de los casos de muerte'))
fig.update_layout(title="Factor de crecimiento en función de la fecha de los diferentes tipos de casos en Barranquilla",
                 xaxis_title="Fecha",yaxis_title="Factor de crecimiento",
                 legend=dict(x=0,y=-0.4,traceorder="normal"))
fig.show()
Promedio de crecimiento medio del número de casos confirmados en Barranquilla:  inf
Mediana de crecimiento medio del número de casos confirmados en Barranquilla:  1.0407084324610099
Promedio de crecimiento medio del número de casos recuperados en Barranquilla:  inf
Mediana de crecimiento medio del número de casos recuperados en Barranquilla:  1.0425531914893618
Promedio de crecimiento medio del número de casos de muerte en Barranquilla:  inf
Mediana de crecimiento medio del número de casos de muerte en Barranquilla:  1.0157249802897104

MODELOS DE PREDICCIÓN BARRANQUILLA

CASOS CONFIRMADOS

Modelo ARIMA (Usando Auto-ARIMA)

In [203]:
model_train=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
y_pred=valid.copy()
In [204]:
model_arima= auto_arima(model_train["Acum_confirmados"],trace=True, error_action='ignore', start_p=1,start_q=1,max_p=3,max_q=3,
                   suppress_warnings=True,stepwise=False,seasonal=False)
model_arima.fit(model_train["Acum_confirmados"])
 ARIMA(0,2,0)(0,0,0)[0] intercept   : AIC=2134.251, Time=0.02 sec
 ARIMA(0,2,1)(0,0,0)[0] intercept   : AIC=2074.224, Time=0.18 sec
 ARIMA(0,2,2)(0,0,0)[0] intercept   : AIC=2076.178, Time=0.21 sec
 ARIMA(0,2,3)(0,0,0)[0] intercept   : AIC=2076.863, Time=0.36 sec
 ARIMA(1,2,0)(0,0,0)[0] intercept   : AIC=2098.932, Time=0.14 sec
 ARIMA(1,2,1)(0,0,0)[0] intercept   : AIC=2076.188, Time=0.25 sec
 ARIMA(1,2,2)(0,0,0)[0] intercept   : AIC=2077.543, Time=0.37 sec
 ARIMA(1,2,3)(0,0,0)[0] intercept   : AIC=2078.388, Time=0.74 sec
 ARIMA(2,2,0)(0,0,0)[0] intercept   : AIC=2080.463, Time=0.17 sec
 ARIMA(2,2,1)(0,0,0)[0] intercept   : AIC=2077.057, Time=0.33 sec
 ARIMA(2,2,2)(0,0,0)[0] intercept   : AIC=2079.418, Time=0.56 sec
 ARIMA(2,2,3)(0,0,0)[0] intercept   : AIC=2067.803, Time=0.72 sec
 ARIMA(3,2,0)(0,0,0)[0] intercept   : AIC=2079.734, Time=0.18 sec
 ARIMA(3,2,1)(0,0,0)[0] intercept   : AIC=2078.814, Time=0.51 sec
 ARIMA(3,2,2)(0,0,0)[0] intercept   : AIC=2080.404, Time=0.63 sec
Total fit time: 5.382 seconds
Out[204]:
ARIMA(order=(2, 2, 3), scoring_args={}, suppress_warnings=True)
In [205]:
prediction_arima=model_arima.predict(len(valid))
y_pred["ARIMA Model Prediction"]=prediction_arima
In [206]:
model_scores.append(np.sqrt(mean_squared_error(valid["Acum_confirmados"],prediction_arima)))
print("Error Cuadrático Medio Modelo ARIMA: ",np.sqrt(mean_squared_error(valid["Acum_confirmados"],prediction_arima)))
Error Cuadrático Medio Modelo ARIMA:  119.45849978257633
In [207]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=model_train.index, y=model_train["Acum_confirmados"],
                    mode='lines+markers',name="Datos de entrenamiento para casos confirmados"))
fig.add_trace(go.Scatter(x=valid.index, y=valid["Acum_confirmados"],
                    mode='lines+markers',name="Datos de validación para datos confirmados",))
fig.add_trace(go.Scatter(x=valid.index, y=y_pred["ARIMA Model Prediction"],
                    mode='lines+markers',name="Predicción de casos confirmados",))
fig.update_layout(title="Predicción de casos confirmados con el modelo ARIMA de Barranquilla",
                 xaxis_title="Fecha",yaxis_title="Acum_confirmados",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [208]:
ARIMA_model_new_prediction=[]
for i in range(1,18):
    ARIMA_model_new_prediction.append(model_arima.predict(len(valid)+i)[-1])
pd.DataFrame(zip(new_date,ARIMA_model_new_prediction),columns=["Confirmados","Predicción Modelo ARIMA"]).head()
Out[208]:
Confirmados Predicción Modelo ARIMA
0 2020-09-05 36806.277222
1 2020-09-06 36874.107328
2 2020-09-07 36937.896086
3 2020-09-08 36993.223115
4 2020-09-09 37053.053110

Modelo Prophet

In [209]:
prophet_c=Prophet(interval_width=0.75,weekly_seasonality=True,)
prophet_confirmed=pd.DataFrame(zip(list(df_Nuevo.index),list(df_Nuevo["Acum_confirmados"])),columns=['ds','y'])
In [210]:
prophet_c.fit(prophet_confirmed)
INFO:fbprophet:Disabling yearly seasonality. Run prophet with yearly_seasonality=True to override this.
INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.
Out[210]:
<fbprophet.forecaster.Prophet at 0x1c22ba1a3c8>
In [211]:
forecast_c=prophet_c.make_future_dataframe(periods=17)
forecast_confirmed=forecast_c.copy()
In [212]:
confirmed_forecast=prophet_c.predict(forecast_c)
In [213]:
model_scores.append(np.sqrt(mean_squared_error(df_Nuevo["Acum_confirmados"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
print("Error Cuadrático Medio Modelo Prophet: ",np.sqrt(mean_squared_error(df_Nuevo["Acum_confirmados"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
Error Cuadrático Medio Modelo Prophet:  178.05033356560548
In [214]:
print(prophet_c.plot(confirmed_forecast))
Figure(720x432)
In [215]:
print(prophet_c.plot_components(confirmed_forecast))
Figure(648x432)

CASOS FALLECIDOS

Modelo ARIMA (Usando Auto-ARIMA)

In [216]:
model_train=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
y_pred=valid.copy()
In [217]:
model_arima= auto_arima(model_train["Acum_muertos"],trace=True, error_action='ignore', start_p=1,start_q=1,max_p=3,max_q=3,
                   suppress_warnings=True,stepwise=False,seasonal=False)
model_arima.fit(model_train["Acum_muertos"])
 ARIMA(0,2,0)(0,0,0)[0] intercept   : AIC=998.172, Time=0.03 sec
 ARIMA(0,2,1)(0,0,0)[0] intercept   : AIC=947.726, Time=0.10 sec
 ARIMA(0,2,2)(0,0,0)[0] intercept   : AIC=948.149, Time=0.10 sec
 ARIMA(0,2,3)(0,0,0)[0] intercept   : AIC=948.622, Time=0.17 sec
 ARIMA(1,2,0)(0,0,0)[0] intercept   : AIC=958.549, Time=0.06 sec
 ARIMA(1,2,1)(0,0,0)[0] intercept   : AIC=948.531, Time=0.12 sec
 ARIMA(1,2,2)(0,0,0)[0] intercept   : AIC=948.581, Time=0.27 sec
 ARIMA(1,2,3)(0,0,0)[0] intercept   : AIC=950.530, Time=0.26 sec
 ARIMA(2,2,0)(0,0,0)[0] intercept   : AIC=953.153, Time=0.11 sec
 ARIMA(2,2,1)(0,0,0)[0] intercept   : AIC=950.106, Time=0.20 sec
 ARIMA(2,2,2)(0,0,0)[0] intercept   : AIC=950.568, Time=0.30 sec
 ARIMA(2,2,3)(0,0,0)[0] intercept   : AIC=942.809, Time=0.85 sec
 ARIMA(3,2,0)(0,0,0)[0] intercept   : AIC=939.961, Time=0.12 sec
 ARIMA(3,2,1)(0,0,0)[0] intercept   : AIC=938.137, Time=0.31 sec
 ARIMA(3,2,2)(0,0,0)[0] intercept   : AIC=932.969, Time=0.26 sec
Total fit time: 3.275 seconds
Out[217]:
ARIMA(order=(3, 2, 2), scoring_args={}, suppress_warnings=True)
In [218]:
prediction_arima=model_arima.predict(len(valid))
y_pred["ARIMA Model Prediction"]=prediction_arima
In [219]:
model_scores.append(np.sqrt(mean_squared_error(valid["Acum_muertos"],prediction_arima)))
print("Error Cuadrático Medio Modelo ARIMA: ",np.sqrt(mean_squared_error(valid["Acum_muertos"],prediction_arima)))
Error Cuadrático Medio Modelo ARIMA:  5.117654283061403
In [220]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=model_train.index, y=model_train["Acum_muertos"],
                    mode='lines+markers',name="Datos de entrenamiento para casos fallecidos"))
fig.add_trace(go.Scatter(x=valid.index, y=valid["Acum_muertos"],
                    mode='lines+markers',name="Datos de validación para datos fallecidos",))
fig.add_trace(go.Scatter(x=valid.index, y=y_pred["ARIMA Model Prediction"],
                    mode='lines+markers',name="Predicción de casos fallecidos",))
fig.update_layout(title="Predicción de casos fallecidos con el modelo ARIMA de Barranquilla",
                 xaxis_title="Fecha",yaxis_title="Acum_muertos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [221]:
ARIMA_model_new_prediction=[]
for i in range(1,18):
    ARIMA_model_new_prediction.append(model_arima.predict(len(valid)+i)[-1])
pd.DataFrame(zip(new_date,ARIMA_model_new_prediction),columns=["Fallecidos","Predicción Modelo ARIMA"]).head()
Out[221]:
Fallecidos Predicción Modelo ARIMA
0 2020-09-05 1621.311352
1 2020-09-06 1622.659411
2 2020-09-07 1624.156402
3 2020-09-08 1625.379131
4 2020-09-09 1626.608932

Modelo Prophet

In [222]:
prophet_c=Prophet(interval_width=0.75,weekly_seasonality=True,)
prophet_confirmed=pd.DataFrame(zip(list(df_Nuevo.index),list(df_Nuevo["Acum_muertos"])),columns=['ds','y'])
In [223]:
prophet_c.fit(prophet_confirmed)
INFO:fbprophet:Disabling yearly seasonality. Run prophet with yearly_seasonality=True to override this.
INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.
Out[223]:
<fbprophet.forecaster.Prophet at 0x1c22b15f508>
In [224]:
forecast_c=prophet_c.make_future_dataframe(periods=17)
forecast_confirmed=forecast_c.copy()
In [225]:
confirmed_forecast=prophet_c.predict(forecast_c)
In [226]:
model_scores.append(np.sqrt(mean_squared_error(df_Nuevo["Acum_muertos"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
print("Error Cuadrático Medio Modelo Prophet: ",np.sqrt(mean_squared_error(df_Nuevo["Acum_muertos"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
Error Cuadrático Medio Modelo Prophet:  5.302277513397939
In [227]:
print(prophet_c.plot(confirmed_forecast))
Figure(720x432)
In [228]:
print(prophet_c.plot_components(confirmed_forecast))
Figure(648x432)

CASOS RECUPERADOS

Modelo ARIMA (Usando Auto-ARIMA)

In [229]:
model_train=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
y_pred=valid.copy()
In [230]:
model_arima= auto_arima(model_train["Acum_Recuperados"],trace=True, error_action='ignore', start_p=1,start_q=1,max_p=3,max_q=3,
                   suppress_warnings=True,stepwise=False,seasonal=False)
model_arima.fit(model_train["Acum_Recuperados"])
 ARIMA(0,2,0)(0,0,0)[0] intercept   : AIC=2290.473, Time=0.02 sec
 ARIMA(0,2,1)(0,0,0)[0] intercept   : AIC=2216.807, Time=0.19 sec
 ARIMA(0,2,2)(0,0,0)[0] intercept   : AIC=2218.405, Time=0.30 sec
 ARIMA(0,2,3)(0,0,0)[0] intercept   : AIC=2217.043, Time=0.39 sec
 ARIMA(1,2,0)(0,0,0)[0] intercept   : AIC=2230.180, Time=0.12 sec
 ARIMA(1,2,1)(0,0,0)[0] intercept   : AIC=2218.246, Time=0.30 sec
 ARIMA(1,2,2)(0,0,0)[0] intercept   : AIC=2218.235, Time=0.37 sec
 ARIMA(1,2,3)(0,0,0)[0] intercept   : AIC=2216.894, Time=0.50 sec
 ARIMA(2,2,0)(0,0,0)[0] intercept   : AIC=2228.758, Time=0.18 sec
 ARIMA(2,2,1)(0,0,0)[0] intercept   : AIC=2217.545, Time=0.39 sec
 ARIMA(2,2,2)(0,0,0)[0] intercept   : AIC=2218.381, Time=0.42 sec
 ARIMA(2,2,3)(0,0,0)[0] intercept   : AIC=2197.135, Time=0.66 sec
 ARIMA(3,2,0)(0,0,0)[0] intercept   : AIC=2224.039, Time=0.21 sec
 ARIMA(3,2,1)(0,0,0)[0] intercept   : AIC=2216.599, Time=0.48 sec
 ARIMA(3,2,2)(0,0,0)[0] intercept   : AIC=2212.562, Time=0.86 sec
Total fit time: 5.396 seconds
Out[230]:
ARIMA(order=(2, 2, 3), scoring_args={}, suppress_warnings=True)
In [231]:
prediction_arima=model_arima.predict(len(valid))
y_pred["ARIMA Model Prediction"]=prediction_arima
In [232]:
model_scores.append(np.sqrt(mean_squared_error(valid["Acum_Recuperados"],prediction_arima)))
print("Error Cuadrático Medio Modelo ARIMA: ",np.sqrt(mean_squared_error(valid["Acum_Recuperados"],prediction_arima)))
Error Cuadrático Medio Modelo ARIMA:  238.11682743109577
In [233]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=model_train.index, y=model_train["Acum_Recuperados"],
                    mode='lines+markers',name="Datos de entrenamiento para casos recuperados"))
fig.add_trace(go.Scatter(x=valid.index, y=valid["Acum_Recuperados"],
                    mode='lines+markers',name="Datos de validación para datos recuperados",))
fig.add_trace(go.Scatter(x=valid.index, y=y_pred["ARIMA Model Prediction"],
                    mode='lines+markers',name="Predicción de casos recuperados",))
fig.update_layout(title="Predicción de casos recuperados con el modelo ARIMA de Barranquilla",
                 xaxis_title="Fecha",yaxis_title="Acum_Recuperados",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [234]:
ARIMA_model_new_prediction=[]
for i in range(1,18):
    ARIMA_model_new_prediction.append(model_arima.predict(len(valid)+i)[-1])
pd.DataFrame(zip(new_date,ARIMA_model_new_prediction),columns=["Recuperados","Predicción Modelo ARIMA"]).head()
Out[234]:
Recuperados Predicción Modelo ARIMA
0 2020-09-05 34108.151168
1 2020-09-06 34353.978244
2 2020-09-07 34634.806093
3 2020-09-08 34868.321328
4 2020-09-09 35139.723175

Híbrido

In [235]:
prophet_c=Prophet(interval_width=0.75,weekly_seasonality=True,)
prophet_confirmed=pd.DataFrame(zip(list(df_Nuevo.index),list(df_Nuevo["Acum_Recuperados"])),columns=['ds','y'])
In [236]:
prophet_c.fit(prophet_confirmed)
INFO:fbprophet:Disabling yearly seasonality. Run prophet with yearly_seasonality=True to override this.
INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.
Out[236]:
<fbprophet.forecaster.Prophet at 0x1c22b5a37c8>
In [237]:
forecast_c=prophet_c.make_future_dataframe(periods=17)
forecast_confirmed=forecast_c.copy()
In [238]:
confirmed_forecast=prophet_c.predict(forecast_c)
In [239]:
model_scores.append(np.sqrt(mean_squared_error(df_Nuevo["Acum_Recuperados"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
print("Error Cuadrático Medio Modelo Prophet: ",np.sqrt(mean_squared_error(df_Nuevo["Acum_Recuperados"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
Error Cuadrático Medio Modelo Prophet:  369.79171740210666
In [240]:
print(prophet_c.plot(confirmed_forecast))
Figure(720x432)
In [241]:
print(prophet_c.plot_components(confirmed_forecast))
Figure(648x432)

CASOS ACTIVOS

Modelo ARIMA (Usando Auto-ARIMA)

In [242]:
model_train=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
y_pred=valid.copy()
In [243]:
model_arima= auto_arima(model_train["Acum_Activos"],trace=True, error_action='ignore', start_p=1,start_q=1,max_p=3,max_q=3,
                   suppress_warnings=True,stepwise=False,seasonal=False)
model_arima.fit(model_train["Acum_Activos"])
 ARIMA(0,2,0)(0,0,0)[0] intercept   : AIC=2313.107, Time=0.03 sec
 ARIMA(0,2,1)(0,0,0)[0] intercept   : AIC=2254.694, Time=0.22 sec
 ARIMA(0,2,2)(0,0,0)[0] intercept   : AIC=2256.643, Time=0.33 sec
 ARIMA(0,2,3)(0,0,0)[0] intercept   : AIC=2258.643, Time=0.42 sec
 ARIMA(1,2,0)(0,0,0)[0] intercept   : AIC=2276.029, Time=0.06 sec
 ARIMA(1,2,1)(0,0,0)[0] intercept   : AIC=2256.643, Time=0.32 sec
 ARIMA(1,2,2)(0,0,0)[0] intercept   : AIC=2256.730, Time=0.70 sec
 ARIMA(1,2,3)(0,0,0)[0] intercept   : AIC=2258.095, Time=0.73 sec
 ARIMA(2,2,0)(0,0,0)[0] intercept   : AIC=2268.188, Time=0.16 sec
 ARIMA(2,2,1)(0,0,0)[0] intercept   : AIC=2258.641, Time=0.45 sec
 ARIMA(2,2,2)(0,0,0)[0] intercept   : AIC=2258.184, Time=0.61 sec
 ARIMA(2,2,3)(0,0,0)[0] intercept   : AIC=2257.730, Time=1.06 sec
 ARIMA(3,2,0)(0,0,0)[0] intercept   : AIC=2263.545, Time=0.25 sec
 ARIMA(3,2,1)(0,0,0)[0] intercept   : AIC=2259.839, Time=0.62 sec
 ARIMA(3,2,2)(0,0,0)[0] intercept   : AIC=2259.719, Time=0.76 sec
Total fit time: 6.725 seconds
Out[243]:
ARIMA(order=(0, 2, 1), scoring_args={}, suppress_warnings=True)
In [244]:
prediction_arima=model_arima.predict(len(valid))
y_pred["ARIMA Model Prediction"]=prediction_arima
In [245]:
model_scores.append(np.sqrt(mean_squared_error(valid["Acum_Activos"],prediction_arima)))
print("Error Cuadrático Medio Modelo ARIMA: ",np.sqrt(mean_squared_error(valid["Acum_Activos"],prediction_arima)))
Error Cuadrático Medio Modelo ARIMA:  174.75107126465545
In [246]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=model_train.index, y=model_train["Acum_Activos"],
                    mode='lines+markers',name="Datos de entrenamiento para casos activos"))
fig.add_trace(go.Scatter(x=valid.index, y=valid["Acum_Activos"],
                    mode='lines+markers',name="Datos de validación para datos activos",))
fig.add_trace(go.Scatter(x=valid.index, y=y_pred["ARIMA Model Prediction"],
                    mode='lines+markers',name="Predicción de casos activos",))
fig.update_layout(title="Predicción de casos activos con el modelo ARIMA de Barranquilla",
                 xaxis_title="Fecha",yaxis_title="Acum_muertos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [247]:
ARIMA_model_new_prediction=[]
for i in range(1,18):
    ARIMA_model_new_prediction.append(model_arima.predict(len(valid)+i)[-1])
pd.DataFrame(zip(new_date,ARIMA_model_new_prediction),columns=["Activos","Predicción Modelo ARIMA"]).head()
Out[247]:
Activos Predicción Modelo ARIMA
0 2020-09-05 980.958647
1 2020-09-06 777.115895
2 2020-09-07 572.172178
3 2020-09-08 366.127496
4 2020-09-09 158.981850

Híbrido

In [248]:
prophet_c=Prophet(interval_width=0.75,weekly_seasonality=True,)
prophet_confirmed=pd.DataFrame(zip(list(df_Nuevo.index),list(df_Nuevo["Acum_Activos"])),columns=['ds','y'])
In [249]:
prophet_c.fit(prophet_confirmed)
INFO:fbprophet:Disabling yearly seasonality. Run prophet with yearly_seasonality=True to override this.
INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.
Out[249]:
<fbprophet.forecaster.Prophet at 0x1c22bd35588>
In [250]:
forecast_c=prophet_c.make_future_dataframe(periods=17)
forecast_confirmed=forecast_c.copy()
In [251]:
confirmed_forecast=prophet_c.predict(forecast_c)
In [252]:
model_scores.append(np.sqrt(mean_squared_error(df_Nuevo["Acum_Activos"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
print("Error Cuadrático Medio Modelo Prophet: ",np.sqrt(mean_squared_error(df_Nuevo["Acum_Activos"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
Error Cuadrático Medio Modelo Prophet:  232.66457672865963
In [253]:
print(prophet_c.plot(confirmed_forecast))
Figure(720x432)
In [254]:
print(prophet_c.plot_components(confirmed_forecast))
Figure(648x432)

BOGOTA

In [255]:
# Se filtra por la ciudad de interés
nombre='Bogotá D.C.'
x=dfCovid[dfCovid['Ciudad de ubicación']==nombre].sort_values(by='Fecha de muerte',ascending=False)
x=x[['ID de caso','atención','fecha reporte web','Fecha de muerte','Fecha de notificación','Fecha diagnostico','Fecha recuperado']]
x
Out[255]:
ID de caso atención fecha reporte web Fecha de muerte Fecha de notificación Fecha diagnostico Fecha recuperado
567919 567960 Fallecido 2020-08-26 2020-09-04 2020-08-26 2020-08-25 NaT
484518 484559 Fallecido 2020-08-18 2020-09-04 2020-08-14 2020-08-16 NaT
463739 463780 Fallecido 2020-08-16 2020-09-04 2020-08-13 2020-08-16 NaT
567618 567659 Fallecido 2020-08-26 2020-09-04 2020-08-26 2020-08-25 NaT
390492 390533 Fallecido 2020-08-10 2020-09-04 2020-08-03 2020-08-04 NaT
... ... ... ... ... ... ... ...
647914 647955 Casa 2020-09-04 NaT 2020-08-24 2020-08-28 NaT
647915 647956 Casa 2020-09-04 NaT 2020-08-25 2020-08-28 NaT
647916 647957 Casa 2020-09-04 NaT 2020-08-26 2020-08-27 NaT
647917 647958 Casa 2020-09-04 NaT 2020-08-26 2020-08-27 NaT
647918 647959 Casa 2020-09-04 NaT 2020-08-22 2020-08-29 NaT

221738 rows × 7 columns

In [256]:
# Se construye el Data Set Covid-19

#Conteo de muertos
m=x[x['atención']=='Fallecido'].groupby('Fecha de muerte').count()
m=pd.DataFrame({'Fecha':m.index.values,'Muertos':[n for n in m.values[:,0]]})

#Conteo de Confirmados
c=x.groupby('Fecha de notificación').count()
c=pd.DataFrame({'Fecha':c.index.values,'Confirmados':[n for n in c.values[:,0]]})

#Conteo Recuperados
r=x.groupby('Fecha recuperado').count()
r=pd.DataFrame({'Fecha':r.index.values,'Recuperados':[n for n in r.values[:,0]]})

df_Nuevo=pd.concat([dfCovid_Nuevo,c,m,r])
df_Nuevo.sort_values(by='Fecha',ascending=True)
df_Nuevo=df_Nuevo.groupby('Fecha').sum().sort_values(by='Fecha',ascending=True)

def acum(df,Col):
  m=df[Col].values
  d=0
  L=[]
  for n in m:
    d=d+n
    L.append(d)
  return L

df_Nuevo['Acum_muertos']=acum(df_Nuevo,'Muertos')
df_Nuevo['Acum_confirmados']=acum(df_Nuevo,'Confirmados')
df_Nuevo['Acum_Recuperados']=acum(df_Nuevo,'Recuperados')
df_Nuevo['Acum_Activos']=df_Nuevo['Acum_confirmados']-df_Nuevo['Acum_Recuperados']-df_Nuevo['Acum_muertos']
df_Nuevo
Out[256]:
Muertos Confirmados Recuperados Acum_muertos Acum_confirmados Acum_Recuperados Acum_Activos
Fecha
2020-03-02 0.000000 1.000000 0.000000 0.000000 1.000000 0.000000 1.000000
2020-03-03 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.000000
2020-03-04 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.000000
2020-03-05 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.000000
2020-03-06 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.000000
... ... ... ... ... ... ... ...
2020-08-31 49.000000 1887.000000 2519.000000 5583.000000 220068.000000 151192.000000 63293.000000
2020-09-01 40.000000 1315.000000 4431.000000 5623.000000 221383.000000 155623.000000 60137.000000
2020-09-02 45.000000 340.000000 3441.000000 5668.000000 221723.000000 159064.000000 56991.000000
2020-09-03 35.000000 15.000000 1906.000000 5703.000000 221738.000000 160970.000000 55065.000000
2020-09-04 9.000000 0.000000 799.000000 5712.000000 221738.000000 161769.000000 54257.000000

187 rows × 7 columns

ANÁLISIS EXPLORATORIO DE DATOS

In [257]:
print("Estructura del dataset: ",df_Nuevo.shape)
print("Variables con valores nulos",df_Nuevo.isnull().sum())
print("Tipo de variables del dataset",df_Nuevo.dtypes)
Estructura del dataset:  (187, 7)
Variables con valores nulos Muertos             0
Confirmados         0
Recuperados         0
Acum_muertos        0
Acum_confirmados    0
Acum_Recuperados    0
Acum_Activos        0
dtype: int64
Tipo de variables del dataset Muertos             float64
Confirmados         float64
Recuperados         float64
Acum_muertos        float64
Acum_confirmados    float64
Acum_Recuperados    float64
Acum_Activos        float64
dtype: object
In [258]:
print("Información Básica")
df_Nuevo.iloc(0)[-1]
Información Básica
Out[258]:
Muertos                 9.000000
Confirmados             0.000000
Recuperados           799.000000
Acum_muertos         5712.000000
Acum_confirmados   221738.000000
Acum_Recuperados   161769.000000
Acum_Activos        54257.000000
Name: 2020-09-04 00:00:00, dtype: float64
In [259]:
fig=px.bar(x=df_Nuevo.index,y=df_Nuevo["Acum_Activos"])
fig.update_layout(title="Distribución del número de casos activos en Bogotá D.C. ",
                  xaxis_title="Fecha",yaxis_title="Número de casos en Bogotá D.C.",)
fig.show()
In [260]:
fig=px.bar(x=df_Nuevo.index,y=df_Nuevo["Acum_Recuperados"]+df_Nuevo["Acum_muertos"])
fig.update_layout(title="Distribución del número de casos cerrados en Bogotá D.C.",
                  xaxis_title="Fecha",yaxis_title="Número de casos en Bogotá D.C.")
fig.show()
In [261]:
df_Nuevo["WeekOfYear"]=df_Nuevo.index.weekofyear

week_num=[]
weekwise_confirmed=[]
weekwise_recovered=[]
weekwise_deaths=[]
weekwise_active=[]
w=1
for i in list(df_Nuevo["WeekOfYear"].unique()):
    weekwise_confirmed.append(df_Nuevo[df_Nuevo["WeekOfYear"]==i]["Acum_confirmados"].iloc[-1])
    weekwise_recovered.append(df_Nuevo[df_Nuevo["WeekOfYear"]==i]["Acum_Recuperados"].iloc[-1])
    weekwise_deaths.append(df_Nuevo[df_Nuevo["WeekOfYear"]==i]["Acum_muertos"].iloc[-1])
    weekwise_active.append(df_Nuevo[df_Nuevo["WeekOfYear"]==i]["Acum_Activos"].iloc[-1])
    week_num.append(w)
    w=w+1

fig=go.Figure()
fig.add_trace(go.Scatter(x=week_num, y=weekwise_confirmed,
                    mode='lines+markers',
                    name='Crecimiento semanal de los casos confirmados'))
fig.add_trace(go.Scatter(x=week_num, y=weekwise_recovered,
                    mode='lines+markers',
                    name='Crecimiento semanal de los casos recuperados'))
fig.add_trace(go.Scatter(x=week_num, y=weekwise_deaths,
                    mode='lines+markers',
                    name='Crecimiento semanal de los casos de muerte'))
fig.add_trace(go.Scatter(x=week_num, y=weekwise_active,
                    mode='lines+markers',
                    name='Crecimiento semanal de los casos Activos'))
fig.update_layout(title="Crecimiento semanal de diferentes tipos de casos en Bogotá D.C.",
                 xaxis_title="Número de semanas",yaxis_title="Número de casos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [262]:
fig, (ax1,ax2) = plt.subplots(1, 2,figsize=(15,5))
sns.barplot(x=week_num,y=pd.Series(weekwise_confirmed).diff().fillna(0),ax=ax1)
sns.barplot(x=week_num,y=pd.Series(weekwise_deaths).diff().fillna(0),ax=ax2)
ax1.set_xlabel("Número de semanas")
ax2.set_xlabel("Número de semanas")
ax1.set_ylabel("Número de casos confirmados")
ax2.set_ylabel("Número de casos de fallecidos")
ax1.set_title("Aumento semanal del número de casos confirmados en Bogotá D.C.")
ax2.set_title("Aumento semanal del número de casos de muerte en Bogotá D.C.")
Out[262]:
Text(0.5, 1.0, 'Aumento semanal del número de casos de muerte en Bogotá D.C.')

Tasa de crecimiento de los casos confirmados, recuperados y de muerte

In [263]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_confirmados"],
                    mode='lines+markers',
                    name='Casos confirmados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Recuperados"],
                    mode='lines+markers',
                    name='Casos Recuperados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_muertos"],
                    mode='lines+markers',
                    name='Casos de muertes'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Activos"],
                    mode='lines+markers',
                    name='Casos Activos'))
fig.update_layout(title="Crecimiento de los diferentes tipos de casos en Bogotá D.C.",
                 xaxis_title="Fecha",yaxis_title="Número de casos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()

Análisis de la tasa de moralidad y recuperación

In [264]:
df_Nuevo["Tasa de mortalidad"]=(df_Nuevo["Acum_muertos"]/df_Nuevo["Acum_confirmados"])*100
df_Nuevo["Tasa de Recuperacion"]=(df_Nuevo["Acum_Recuperados"]/df_Nuevo["Acum_confirmados"])*100
df_Nuevo["Casos Cerrados"]=df_Nuevo["Acum_Recuperados"]+df_Nuevo["Acum_muertos"]

print("Tasa de mortalidad media",df_Nuevo["Tasa de mortalidad"].mean())
print("Tasa de mortalidad media",df_Nuevo["Tasa de mortalidad"].median())
print("Promedio de la tasa de recuperación",df_Nuevo["Tasa de Recuperacion"].mean())
print("Tasa de recuperación media",df_Nuevo["Tasa de Recuperacion"].median())

#Plotting Mortality and Recovery Rate 
fig = make_subplots(rows=2, cols=1,
                   subplot_titles=("Tasa de Recuperacion", "Tasa de mortalidad"))
fig.add_trace(
    go.Scatter(x=df_Nuevo.index, y=(df_Nuevo["Acum_Recuperados"]/df_Nuevo["Acum_confirmados"])*100,name="Tasa de Recuperacion"),
    row=1, col=1
)
fig.add_trace(
    go.Scatter(x=df_Nuevo.index, y=(df_Nuevo["Acum_muertos"]/df_Nuevo["Acum_confirmados"])*100,name="Tasa de mortalidad"),
    row=2, col=1
)
fig.update_layout(height=1000,legend=dict(x=-0.1,y=1.2,traceorder="normal"))
fig.update_xaxes(title_text="Fecha", row=1, col=1)
fig.update_yaxes(title_text="Tasa de Recuperacion en Bogotá D.C.", row=1, col=1)
fig.update_xaxes(title_text="Fecha", row=1, col=2)
fig.update_yaxes(title_text="Tasa de mortalidad en Bogotá D.C.", row=1, col=2)
fig.show()
Tasa de mortalidad media 2.201203265533025
Tasa de mortalidad media 2.362266520169518
Promedio de la tasa de recuperación 29.198467149195885
Tasa de recuperación media 31.29485494794299
In [265]:
print("Aumento medio del número de casos confirmados cada día en Bogotá D.C.: ",np.round(df_Nuevo["Acum_confirmados"].diff().fillna(0).mean()))
print("Aumento medio del número de casos recuperados cada día en Bogotá D.C.: ",np.round(df_Nuevo["Acum_Recuperados"].diff().fillna(0).mean()))
print("Aumento promedio del número de casos de muerte cada día en Bogotá D.C.: ",np.round(df_Nuevo["Acum_muertos"].diff().fillna(0).mean()))
print("Aumento promedio del número de casos de activos cada día en Bogotá D.C.: ",np.round(df_Nuevo["Acum_Activos"].diff().fillna(0).mean()))

fig=go.Figure()
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_confirmados"].diff().fillna(0),mode='lines+markers',
                    name='Casos de confirmados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Recuperados"].diff().fillna(0),mode='lines+markers',
                    name='Casos de recuperados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_muertos"].diff().fillna(0),mode='lines+markers',
                    name='Casos de Muerte'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Activos"].diff().fillna(0),mode='lines+markers',
                    name='Casos Activos'))
fig.update_layout(title="Aumento diario de los diferentes tipos de casos en Bogotá D.C.",
                 xaxis_title="Fecha",yaxis_title="Número de casos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
Aumento medio del número de casos confirmados cada día en Bogotá D.C.:  1186.0
Aumento medio del número de casos recuperados cada día en Bogotá D.C.:  865.0
Aumento promedio del número de casos de muerte cada día en Bogotá D.C.:  31.0
Aumento promedio del número de casos de activos cada día en Bogotá D.C.:  290.0
In [266]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_confirmados"].diff().rolling(window=7).mean(),mode='lines+markers',
                    name='Casos Confirmados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Recuperados"].diff().rolling(window=7).mean(),mode='lines+markers',
                    name='Casos Recuperados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_muertos"].diff().rolling(window=7).mean(),mode='lines+markers',
                    name='Casos Fallecidos'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Activos"].diff().rolling(window=7).mean(),mode='lines+markers',
                    name='Casos Activos'))
fig.update_layout(title="Media móvil por cada 7 días de los casos confirmados, recuperados y de muerte en Bogotá D.C.",
                 xaxis_title="Fecha",yaxis_title="Número de casos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [267]:
print("Promedio de crecimiento medio del número de casos confirmados en Bogotá D.C.: ",(df_Nuevo["Acum_confirmados"]/df_Nuevo["Acum_confirmados"].shift()).mean())
print("Mediana de crecimiento medio del número de casos confirmados en Bogotá D.C.: ",(df_Nuevo["Acum_confirmados"]/df_Nuevo["Acum_confirmados"].shift()).median())
print("Promedio de crecimiento medio del número de casos recuperados en Bogotá D.C.: ",(df_Nuevo["Acum_Recuperados"]/df_Nuevo["Acum_Recuperados"].shift()).mean())
print("Mediana de crecimiento medio del número de casos recuperados en Bogotá D.C.: ",(df_Nuevo["Acum_Recuperados"]/df_Nuevo["Acum_Recuperados"].shift()).median())
print("Promedio de crecimiento medio del número de casos de muerte en Bogotá D.C.: ",(df_Nuevo["Acum_muertos"]/df_Nuevo["Acum_muertos"].shift()).mean())
print("Mediana de crecimiento medio del número de casos de muerte en Bogotá D.C.: ",(df_Nuevo["Acum_muertos"]/df_Nuevo["Acum_muertos"].shift()).median())

fig=go.Figure()
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_confirmados"]/df_Nuevo["Acum_confirmados"].shift(),
                    mode='lines',
                    name='Factor de crecimiento de los casos confirmados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Recuperados"]/df_Nuevo["Acum_Recuperados"].shift(),
                    mode='lines',
                    name='Factor de crecimiento de los casos recuperados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_muertos"]/df_Nuevo["Acum_muertos"].shift(),
                    mode='lines',
                    name='Factor de crecimiento de los casos de muerte'))
fig.update_layout(title="Factor de crecimiento en función de la fecha de los diferentes tipos de casos en Bogotá D.C.",
                 xaxis_title="Fecha",yaxis_title="Factor de crecimiento",
                 legend=dict(x=0,y=-0.4,traceorder="normal"))
fig.show()
Promedio de crecimiento medio del número de casos confirmados en Bogotá D.C.:  1.0764751911801969
Mediana de crecimiento medio del número de casos confirmados en Bogotá D.C.:  1.038293583772589
Promedio de crecimiento medio del número de casos recuperados en Bogotá D.C.:  inf
Mediana de crecimiento medio del número de casos recuperados en Bogotá D.C.:  1.0416844872137574
Promedio de crecimiento medio del número de casos de muerte en Bogotá D.C.:  inf
Mediana de crecimiento medio del número de casos de muerte en Bogotá D.C.:  1.034819010613783

MODELOS DE PREDICCIÓN BOGOTA

CASOS CONFIRMADOS

Modelo ARIMA (Usando Auto-ARIMA)

In [268]:
model_train=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
y_pred=valid.copy()
In [269]:
model_arima= auto_arima(model_train["Acum_confirmados"],trace=True, error_action='ignore', start_p=1,start_q=1,max_p=3,max_q=3,
                   suppress_warnings=True,stepwise=False,seasonal=False)
model_arima.fit(model_train["Acum_confirmados"])
 ARIMA(0,2,0)(0,0,0)[0] intercept   : AIC=2759.790, Time=0.02 sec
 ARIMA(0,2,1)(0,0,0)[0] intercept   : AIC=2707.446, Time=0.16 sec
 ARIMA(0,2,2)(0,0,0)[0] intercept   : AIC=2705.119, Time=0.24 sec
 ARIMA(0,2,3)(0,0,0)[0] intercept   : AIC=2705.069, Time=0.57 sec
 ARIMA(1,2,0)(0,0,0)[0] intercept   : AIC=2730.826, Time=0.06 sec
 ARIMA(1,2,1)(0,0,0)[0] intercept   : AIC=2705.061, Time=0.40 sec
 ARIMA(1,2,2)(0,0,0)[0] intercept   : AIC=2710.870, Time=0.78 sec
 ARIMA(1,2,3)(0,0,0)[0] intercept   : AIC=2721.113, Time=0.74 sec
 ARIMA(2,2,0)(0,0,0)[0] intercept   : AIC=2731.760, Time=0.08 sec
 ARIMA(2,2,1)(0,0,0)[0] intercept   : AIC=2706.489, Time=0.52 sec
 ARIMA(2,2,2)(0,0,0)[0] intercept   : AIC=2708.851, Time=0.65 sec
 ARIMA(2,2,3)(0,0,0)[0] intercept   : AIC=2711.135, Time=0.79 sec
 ARIMA(3,2,0)(0,0,0)[0] intercept   : AIC=2717.365, Time=0.12 sec
 ARIMA(3,2,1)(0,0,0)[0] intercept   : AIC=2688.856, Time=0.59 sec
 ARIMA(3,2,2)(0,0,0)[0] intercept   : AIC=2658.907, Time=0.83 sec
Total fit time: 6.572 seconds
Out[269]:
ARIMA(order=(3, 2, 2), scoring_args={}, suppress_warnings=True)
In [270]:
prediction_arima=model_arima.predict(len(valid))
y_pred["ARIMA Model Prediction"]=prediction_arima
In [271]:
model_scores.append(np.sqrt(mean_squared_error(valid["Acum_confirmados"],prediction_arima)))
print("Error Cuadrático Medio Modelo ARIMA: ",np.sqrt(mean_squared_error(valid["Acum_confirmados"],prediction_arima)))
Error Cuadrático Medio Modelo ARIMA:  10252.768172606788
In [272]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=model_train.index, y=model_train["Acum_confirmados"],
                    mode='lines+markers',name="Datos de entrenamiento para casos confirmados"))
fig.add_trace(go.Scatter(x=valid.index, y=valid["Acum_confirmados"],
                    mode='lines+markers',name="Datos de validación para datos confirmados",))
fig.add_trace(go.Scatter(x=valid.index, y=y_pred["ARIMA Model Prediction"],
                    mode='lines+markers',name="Predicción de casos confirmados",))
fig.update_layout(title="Predicción de casos confirmados con el modelo ARIMA de Bogotá D.C.",
                 xaxis_title="Fecha",yaxis_title="Acum_confirmados",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [273]:
ARIMA_model_new_prediction=[]
for i in range(1,18):
    ARIMA_model_new_prediction.append(model_arima.predict(len(valid)+i)[-1])
pd.DataFrame(zip(new_date,ARIMA_model_new_prediction),columns=["Confirmados","Predicción Modelo ARIMA"]).head()
Out[273]:
Confirmados Predicción Modelo ARIMA
0 2020-09-05 243609.196762
1 2020-09-06 246356.890084
2 2020-09-07 250190.916225
3 2020-09-08 254960.059042
4 2020-09-09 260152.492847

Modelo Prophet

In [274]:
prophet_c=Prophet(interval_width=0.75,weekly_seasonality=True,)
prophet_confirmed=pd.DataFrame(zip(list(df_Nuevo.index),list(df_Nuevo["Acum_confirmados"])),columns=['ds','y'])
In [275]:
prophet_c.fit(prophet_confirmed)
INFO:fbprophet:Disabling yearly seasonality. Run prophet with yearly_seasonality=True to override this.
INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.
Out[275]:
<fbprophet.forecaster.Prophet at 0x1c22b1bf848>
In [276]:
forecast_c=prophet_c.make_future_dataframe(periods=17)
forecast_confirmed=forecast_c.copy()
In [277]:
confirmed_forecast=prophet_c.predict(forecast_c)
In [278]:
model_scores.append(np.sqrt(mean_squared_error(df_Nuevo["Acum_confirmados"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
print("Error Cuadrático Medio Modelo Prophet: ",np.sqrt(mean_squared_error(df_Nuevo["Acum_confirmados"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
Error Cuadrático Medio Modelo Prophet:  1677.5330738878984
In [279]:
print(prophet_c.plot(confirmed_forecast))
Figure(720x432)
In [280]:
print(prophet_c.plot_components(confirmed_forecast))
Figure(648x432)

CASOS FALLECIDOS

Modelo ARIMA (Usando Auto-ARIMA)

In [281]:
model_train=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
y_pred=valid.copy()
In [282]:
model_arima= auto_arima(model_train["Acum_muertos"],trace=True, error_action='ignore', start_p=1,start_q=1,max_p=3,max_q=3,
                   suppress_warnings=True,stepwise=False,seasonal=False)
model_arima.fit(model_train["Acum_muertos"])
 ARIMA(0,2,0)(0,0,0)[0] intercept   : AIC=1273.128, Time=0.02 sec
 ARIMA(0,2,1)(0,0,0)[0] intercept   : AIC=1228.187, Time=0.09 sec
 ARIMA(0,2,2)(0,0,0)[0] intercept   : AIC=1230.135, Time=0.19 sec
 ARIMA(0,2,3)(0,0,0)[0] intercept   : AIC=1222.327, Time=0.25 sec
 ARIMA(1,2,0)(0,0,0)[0] intercept   : AIC=1250.635, Time=0.09 sec
 ARIMA(1,2,1)(0,0,0)[0] intercept   : AIC=1230.161, Time=0.12 sec
 ARIMA(1,2,2)(0,0,0)[0] intercept   : AIC=1230.288, Time=0.30 sec
 ARIMA(1,2,3)(0,0,0)[0] intercept   : AIC=1201.650, Time=0.46 sec
 ARIMA(2,2,0)(0,0,0)[0] intercept   : AIC=1227.863, Time=0.11 sec
 ARIMA(2,2,1)(0,0,0)[0] intercept   : AIC=1225.344, Time=0.20 sec
 ARIMA(2,2,2)(0,0,0)[0] intercept   : AIC=1202.578, Time=0.69 sec
 ARIMA(2,2,3)(0,0,0)[0] intercept   : AIC=1203.166, Time=0.63 sec
 ARIMA(3,2,0)(0,0,0)[0] intercept   : AIC=1225.323, Time=0.17 sec
 ARIMA(3,2,1)(0,0,0)[0] intercept   : AIC=1226.889, Time=0.28 sec
 ARIMA(3,2,2)(0,0,0)[0] intercept   : AIC=1203.925, Time=0.63 sec
Total fit time: 4.251 seconds
Out[282]:
ARIMA(order=(1, 2, 3), scoring_args={}, suppress_warnings=True)
In [283]:
prediction_arima=model_arima.predict(len(valid))
y_pred["ARIMA Model Prediction"]=prediction_arima
In [284]:
model_scores.append(np.sqrt(mean_squared_error(valid["Acum_muertos"],prediction_arima)))
print("Error Cuadrático Medio Modelo ARIMA: ",np.sqrt(mean_squared_error(valid["Acum_muertos"],prediction_arima)))
Error Cuadrático Medio Modelo ARIMA:  122.90273315978763
In [285]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=model_train.index, y=model_train["Acum_muertos"],
                    mode='lines+markers',name="Datos de entrenamiento para casos fallecidos"))
fig.add_trace(go.Scatter(x=valid.index, y=valid["Acum_muertos"],
                    mode='lines+markers',name="Datos de validación para datos fallecidos",))
fig.add_trace(go.Scatter(x=valid.index, y=y_pred["ARIMA Model Prediction"],
                    mode='lines+markers',name="Predicción de casos fallecidos",))
fig.update_layout(title="Predicción de casos fallecidos con el modelo ARIMA de Bogotá D.C.",
                 xaxis_title="Fecha",yaxis_title="Acum_muertos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [286]:
ARIMA_model_new_prediction=[]
for i in range(1,18):
    ARIMA_model_new_prediction.append(model_arima.predict(len(valid)+i)[-1])
pd.DataFrame(zip(new_date,ARIMA_model_new_prediction),columns=["Fallecidos","Predicción Modelo ARIMA"]).head()
Out[286]:
Fallecidos Predicción Modelo ARIMA
0 2020-09-05 6031.500839
1 2020-09-06 6111.768583
2 2020-09-07 6193.118500
3 2020-09-08 6275.497274
4 2020-09-09 6358.856244

Modelo Prophet

In [287]:
prophet_c=Prophet(interval_width=0.75,weekly_seasonality=True,)
prophet_confirmed=pd.DataFrame(zip(list(df_Nuevo.index),list(df_Nuevo["Acum_muertos"])),columns=['ds','y'])
In [288]:
prophet_c.fit(prophet_confirmed)
INFO:fbprophet:Disabling yearly seasonality. Run prophet with yearly_seasonality=True to override this.
INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.
Out[288]:
<fbprophet.forecaster.Prophet at 0x1c22c254848>
In [289]:
forecast_c=prophet_c.make_future_dataframe(periods=17)
forecast_confirmed=forecast_c.copy()
In [290]:
confirmed_forecast=prophet_c.predict(forecast_c)
In [291]:
model_scores.append(np.sqrt(mean_squared_error(df_Nuevo["Acum_muertos"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
print("Error Cuadrático Medio Modelo Prophet: ",np.sqrt(mean_squared_error(df_Nuevo["Acum_muertos"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
Error Cuadrático Medio Modelo Prophet:  56.69156428471273
In [292]:
print(prophet_c.plot(confirmed_forecast))
Figure(720x432)
In [293]:
print(prophet_c.plot_components(confirmed_forecast))
Figure(648x432)

CASOS RECUPERADOS

Modelo ARIMA (Usando Auto-ARIMA)

In [294]:
model_train=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
y_pred=valid.copy()
In [295]:
model_arima= auto_arima(model_train["Acum_Recuperados"],trace=True, error_action='ignore', start_p=1,start_q=1,max_p=3,max_q=3,
                   suppress_warnings=True,stepwise=False,seasonal=False)
model_arima.fit(model_train["Acum_Recuperados"])
 ARIMA(0,2,0)(0,0,0)[0] intercept   : AIC=2713.052, Time=0.02 sec
 ARIMA(0,2,1)(0,0,0)[0] intercept   : AIC=2706.570, Time=0.13 sec
 ARIMA(0,2,2)(0,0,0)[0] intercept   : AIC=2688.556, Time=0.31 sec
 ARIMA(0,2,3)(0,0,0)[0] intercept   : AIC=2686.391, Time=0.49 sec
 ARIMA(1,2,0)(0,0,0)[0] intercept   : AIC=2712.176, Time=0.05 sec
 ARIMA(1,2,1)(0,0,0)[0] intercept   : AIC=2690.431, Time=0.30 sec
 ARIMA(1,2,2)(0,0,0)[0] intercept   : AIC=2688.517, Time=0.53 sec
 ARIMA(1,2,3)(0,0,0)[0] intercept   : AIC=2667.934, Time=0.70 sec
 ARIMA(2,2,0)(0,0,0)[0] intercept   : AIC=2701.078, Time=0.07 sec
 ARIMA(2,2,1)(0,0,0)[0] intercept   : AIC=2686.797, Time=0.33 sec
 ARIMA(2,2,2)(0,0,0)[0] intercept   : AIC=2688.008, Time=0.68 sec
 ARIMA(2,2,3)(0,0,0)[0] intercept   : AIC=2673.312, Time=0.70 sec
 ARIMA(3,2,0)(0,0,0)[0] intercept   : AIC=2686.981, Time=0.09 sec
 ARIMA(3,2,1)(0,0,0)[0] intercept   : AIC=2687.088, Time=0.35 sec
 ARIMA(3,2,2)(0,0,0)[0] intercept   : AIC=2677.798, Time=0.66 sec
Total fit time: 5.419 seconds
Out[295]:
ARIMA(order=(1, 2, 3), scoring_args={}, suppress_warnings=True)
In [296]:
prediction_arima=model_arima.predict(len(valid))
y_pred["ARIMA Model Prediction"]=prediction_arima
In [297]:
model_scores.append(np.sqrt(mean_squared_error(valid["Acum_Recuperados"],prediction_arima)))
print("Error Cuadrático Medio Modelo ARIMA: ",np.sqrt(mean_squared_error(valid["Acum_Recuperados"],prediction_arima)))
Error Cuadrático Medio Modelo ARIMA:  2314.66754654849
In [298]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=model_train.index, y=model_train["Acum_Recuperados"],
                    mode='lines+markers',name="Datos de entrenamiento para casos recuperados"))
fig.add_trace(go.Scatter(x=valid.index, y=valid["Acum_Recuperados"],
                    mode='lines+markers',name="Datos de validación para datos recuperados",))
fig.add_trace(go.Scatter(x=valid.index, y=y_pred["ARIMA Model Prediction"],
                    mode='lines+markers',name="Predicción de casos recuperados",))
fig.update_layout(title="Predicción de casos recuperados con el modelo ARIMA de Bogotá D.C.",
                 xaxis_title="Fecha",yaxis_title="Acum_Recuperados",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [299]:
ARIMA_model_new_prediction=[]
for i in range(1,18):
    ARIMA_model_new_prediction.append(model_arima.predict(len(valid)+i)[-1])
pd.DataFrame(zip(new_date,ARIMA_model_new_prediction),columns=["Recuperados","Predicción Modelo ARIMA"]).head()
Out[299]:
Recuperados Predicción Modelo ARIMA
0 2020-09-05 169489.552597
1 2020-09-06 173913.123093
2 2020-09-07 177410.407890
3 2020-09-08 181873.812879
4 2020-09-09 185410.974893

Modelo Prophet

In [300]:
prophet_c=Prophet(interval_width=0.75,weekly_seasonality=True,)
prophet_confirmed=pd.DataFrame(zip(list(df_Nuevo.index),list(df_Nuevo["Acum_Recuperados"])),columns=['ds','y'])
In [301]:
prophet_c.fit(prophet_confirmed)
INFO:fbprophet:Disabling yearly seasonality. Run prophet with yearly_seasonality=True to override this.
INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.
Out[301]:
<fbprophet.forecaster.Prophet at 0x1c22b5a5a48>
In [302]:
forecast_c=prophet_c.make_future_dataframe(periods=17)
forecast_confirmed=forecast_c.copy()
In [303]:
confirmed_forecast=prophet_c.predict(forecast_c)
In [304]:
model_scores.append(np.sqrt(mean_squared_error(df_Nuevo["Acum_Recuperados"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
print("Error Cuadrático Medio Modelo Prophet: ",np.sqrt(mean_squared_error(df_Nuevo["Acum_Recuperados"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
Error Cuadrático Medio Modelo Prophet:  2381.2643206487114
In [305]:
print(prophet_c.plot(confirmed_forecast))
Figure(720x432)
In [306]:
print(prophet_c.plot_components(confirmed_forecast))
Figure(648x432)

CASOS ACTIVOS

Modelo ARIMA (Usando Auto-ARIMA)

In [307]:
model_train=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
y_pred=valid.copy()
In [308]:
model_arima= auto_arima(model_train["Acum_Activos"],trace=True, error_action='ignore', start_p=1,start_q=1,max_p=3,max_q=3,
                   suppress_warnings=True,stepwise=False,seasonal=False)
model_arima.fit(model_train["Acum_Activos"])
 ARIMA(0,2,0)(0,0,0)[0] intercept   : AIC=2854.667, Time=0.02 sec
 ARIMA(0,2,1)(0,0,0)[0] intercept   : AIC=2830.121, Time=0.15 sec
 ARIMA(0,2,2)(0,0,0)[0] intercept   : AIC=2821.248, Time=0.37 sec
 ARIMA(0,2,3)(0,0,0)[0] intercept   : AIC=2855.306, Time=0.29 sec
 ARIMA(1,2,0)(0,0,0)[0] intercept   : AIC=2844.183, Time=0.05 sec
 ARIMA(1,2,1)(0,0,0)[0] intercept   : AIC=2820.017, Time=0.34 sec
 ARIMA(1,2,2)(0,0,0)[0] intercept   : AIC=2821.384, Time=0.51 sec
 ARIMA(1,2,3)(0,0,0)[0] intercept   : AIC=2776.953, Time=0.51 sec
 ARIMA(2,2,0)(0,0,0)[0] intercept   : AIC=2845.672, Time=0.06 sec
 ARIMA(2,2,1)(0,0,0)[0] intercept   : AIC=2819.175, Time=0.48 sec
 ARIMA(2,2,2)(0,0,0)[0] intercept   : AIC=2804.278, Time=0.75 sec
 ARIMA(2,2,3)(0,0,0)[0] intercept   : AIC=2778.879, Time=0.70 sec
 ARIMA(3,2,0)(0,0,0)[0] intercept   : AIC=2764.226, Time=0.11 sec
 ARIMA(3,2,1)(0,0,0)[0] intercept   : AIC=2764.414, Time=0.19 sec
 ARIMA(3,2,2)(0,0,0)[0] intercept   : AIC=2762.390, Time=0.37 sec
Total fit time: 4.919 seconds
Out[308]:
ARIMA(order=(3, 2, 2), scoring_args={}, suppress_warnings=True)
In [309]:
prediction_arima=model_arima.predict(len(valid))
y_pred["ARIMA Model Prediction"]=prediction_arima
In [310]:
model_scores.append(np.sqrt(mean_squared_error(valid["Acum_Activos"],prediction_arima)))
print("Error Cuadrático Medio Modelo ARIMA: ",np.sqrt(mean_squared_error(valid["Acum_Activos"],prediction_arima)))
Error Cuadrático Medio Modelo ARIMA:  5015.911446412631
In [311]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=model_train.index, y=model_train["Acum_Activos"],
                    mode='lines+markers',name="Datos de entrenamiento para casos activos"))
fig.add_trace(go.Scatter(x=valid.index, y=valid["Acum_Activos"],
                    mode='lines+markers',name="Datos de validación para datos activos",))
fig.add_trace(go.Scatter(x=valid.index, y=y_pred["ARIMA Model Prediction"],
                    mode='lines+markers',name="Predicción de casos activos",))
fig.update_layout(title="Predicción de casos activos con el modelo ARIMA de Bogotá D.C.",
                 xaxis_title="Fecha",yaxis_title="Acum_muertos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [312]:
ARIMA_model_new_prediction=[]
for i in range(1,18):
    ARIMA_model_new_prediction.append(model_arima.predict(len(valid)+i)[-1])
pd.DataFrame(zip(new_date,ARIMA_model_new_prediction),columns=["Activos","Predicción Modelo ARIMA"]).head()
Out[312]:
Activos Predicción Modelo ARIMA
0 2020-09-05 60631.903570
1 2020-09-06 58920.178777
2 2020-09-07 58826.150750
3 2020-09-08 56575.019514
4 2020-09-09 56087.029889

Modelo Prophet

In [313]:
prophet_c=Prophet(interval_width=0.75,weekly_seasonality=True,)
prophet_confirmed=pd.DataFrame(zip(list(df_Nuevo.index),list(df_Nuevo["Acum_Activos"])),columns=['ds','y'])
In [314]:
prophet_c.fit(prophet_confirmed)
INFO:fbprophet:Disabling yearly seasonality. Run prophet with yearly_seasonality=True to override this.
INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.
Out[314]:
<fbprophet.forecaster.Prophet at 0x1c22a949048>
In [315]:
forecast_c=prophet_c.make_future_dataframe(periods=17)
forecast_confirmed=forecast_c.copy()
In [316]:
confirmed_forecast=prophet_c.predict(forecast_c)
In [317]:
model_scores.append(np.sqrt(mean_squared_error(df_Nuevo["Acum_Activos"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
print("Error Cuadrático Medio Modelo Prophet: ",np.sqrt(mean_squared_error(df_Nuevo["Acum_Activos"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
Error Cuadrático Medio Modelo Prophet:  9344.958043756991
In [318]:
print(prophet_c.plot(confirmed_forecast))
Figure(720x432)
In [319]:
print(prophet_c.plot_components(confirmed_forecast))
Figure(648x432)

CARTAGENA

In [320]:
# Se filtra por la ciudad de interés
nombre='Cartagena de Indias'
x=dfCovid[dfCovid['Ciudad de ubicación']==nombre].sort_values(by='Fecha de muerte',ascending=False)
x=x[['ID de caso','atención','fecha reporte web','Fecha de muerte','Fecha de notificación','Fecha diagnostico','Fecha recuperado']]
x
Out[320]:
ID de caso atención fecha reporte web Fecha de muerte Fecha de notificación Fecha diagnostico Fecha recuperado
573498 573539 Fallecido 2020-08-27 2020-09-03 2020-08-18 2020-08-26 NaT
615768 615809 Fallecido 2020-09-01 2020-09-02 2020-08-29 2020-08-31 NaT
573745 573786 Fallecido 2020-08-27 2020-09-01 2020-08-20 2020-08-26 NaT
503001 503042 Fallecido 2020-08-20 2020-09-01 2020-08-18 2020-08-19 NaT
614431 614472 Fallecido 2020-08-31 2020-08-31 2020-08-18 2020-08-29 NaT
... ... ... ... ... ... ... ...
649607 649648 Casa 2020-09-04 NaT 2020-08-23 2020-09-03 NaT
649608 649649 Casa 2020-09-04 NaT 2020-08-23 2020-09-03 NaT
649609 649650 Casa 2020-09-04 NaT 2020-08-23 2020-09-03 NaT
649735 649776 Casa 2020-09-04 NaT 2020-08-23 2020-09-03 NaT
649761 649802 Casa 2020-09-04 NaT 2020-08-23 2020-09-03 NaT

20758 rows × 7 columns

In [321]:
# Se construye el Data Set Covid-19

#Conteo de muertos
m=x[x['atención']=='Fallecido'].groupby('Fecha de muerte').count()
m=pd.DataFrame({'Fecha':m.index.values,'Muertos':[n for n in m.values[:,0]]})

#Conteo de Confirmados
c=x.groupby('Fecha de notificación').count()
c=pd.DataFrame({'Fecha':c.index.values,'Confirmados':[n for n in c.values[:,0]]})

#Conteo Recuperados
r=x.groupby('Fecha recuperado').count()
r=pd.DataFrame({'Fecha':r.index.values,'Recuperados':[n for n in r.values[:,0]]})

df_Nuevo=pd.concat([dfCovid_Nuevo,c,m,r])
df_Nuevo.sort_values(by='Fecha',ascending=True)
df_Nuevo=df_Nuevo.groupby('Fecha').sum().sort_values(by='Fecha',ascending=True)

def acum(df,Col):
  m=df[Col].values
  d=0
  L=[]
  for n in m:
    d=d+n
    L.append(d)
  return L

df_Nuevo['Acum_muertos']=acum(df_Nuevo,'Muertos')
df_Nuevo['Acum_confirmados']=acum(df_Nuevo,'Confirmados')
df_Nuevo['Acum_Recuperados']=acum(df_Nuevo,'Recuperados')
df_Nuevo['Acum_Activos']=df_Nuevo['Acum_confirmados']-df_Nuevo['Acum_Recuperados']-df_Nuevo['Acum_muertos']
df_Nuevo
Out[321]:
Muertos Confirmados Recuperados Acum_muertos Acum_confirmados Acum_Recuperados Acum_Activos
Fecha
2020-03-02 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
2020-03-03 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
2020-03-04 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
2020-03-05 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
2020-03-06 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
... ... ... ... ... ... ... ...
2020-08-31 2.000000 25.000000 164.000000 524.000000 20736.000000 18465.000000 1747.000000
2020-09-01 2.000000 10.000000 77.000000 526.000000 20746.000000 18542.000000 1678.000000
2020-09-02 1.000000 8.000000 63.000000 527.000000 20754.000000 18605.000000 1622.000000
2020-09-03 1.000000 4.000000 201.000000 528.000000 20758.000000 18806.000000 1424.000000
2020-09-04 0.000000 0.000000 155.000000 528.000000 20758.000000 18961.000000 1269.000000

187 rows × 7 columns

ANÁLISIS EXPLORATORIO DE DATOS

In [322]:
print("Estructura del dataset: ",df_Nuevo.shape)
print("Variables con valores nulos",df_Nuevo.isnull().sum())
print("Tipo de variables del dataset",df_Nuevo.dtypes)
Estructura del dataset:  (187, 7)
Variables con valores nulos Muertos             0
Confirmados         0
Recuperados         0
Acum_muertos        0
Acum_confirmados    0
Acum_Recuperados    0
Acum_Activos        0
dtype: int64
Tipo de variables del dataset Muertos             float64
Confirmados         float64
Recuperados         float64
Acum_muertos        float64
Acum_confirmados    float64
Acum_Recuperados    float64
Acum_Activos        float64
dtype: object
In [323]:
print("Información Básica")
df_Nuevo.iloc(0)[-1]
Información Básica
Out[323]:
Muertos                0.000000
Confirmados            0.000000
Recuperados          155.000000
Acum_muertos         528.000000
Acum_confirmados   20758.000000
Acum_Recuperados   18961.000000
Acum_Activos        1269.000000
Name: 2020-09-04 00:00:00, dtype: float64
In [324]:
fig=px.bar(x=df_Nuevo.index,y=df_Nuevo["Acum_Activos"])
fig.update_layout(title="Distribución del número de casos activos en Cartagena ",
                  xaxis_title="Fecha",yaxis_title="Número de casos en Cartagena",)
fig.show()
In [325]:
fig=px.bar(x=df_Nuevo.index,y=df_Nuevo["Acum_Recuperados"]+df_Nuevo["Acum_muertos"])
fig.update_layout(title="Distribución del número de casos cerrados en Cartagena",
                  xaxis_title="Fecha",yaxis_title="Número de casos en Cartagena")
fig.show()
In [326]:
df_Nuevo["WeekOfYear"]=df_Nuevo.index.weekofyear

week_num=[]
weekwise_confirmed=[]
weekwise_recovered=[]
weekwise_deaths=[]
weekwise_active=[]
w=1
for i in list(df_Nuevo["WeekOfYear"].unique()):
    weekwise_confirmed.append(df_Nuevo[df_Nuevo["WeekOfYear"]==i]["Acum_confirmados"].iloc[-1])
    weekwise_recovered.append(df_Nuevo[df_Nuevo["WeekOfYear"]==i]["Acum_Recuperados"].iloc[-1])
    weekwise_deaths.append(df_Nuevo[df_Nuevo["WeekOfYear"]==i]["Acum_muertos"].iloc[-1])
    weekwise_active.append(df_Nuevo[df_Nuevo["WeekOfYear"]==i]["Acum_Activos"].iloc[-1])
    week_num.append(w)
    w=w+1

fig=go.Figure()
fig.add_trace(go.Scatter(x=week_num, y=weekwise_confirmed,
                    mode='lines+markers',
                    name='Crecimiento semanal de los casos confirmados'))
fig.add_trace(go.Scatter(x=week_num, y=weekwise_recovered,
                    mode='lines+markers',
                    name='Crecimiento semanal de los casos recuperados'))
fig.add_trace(go.Scatter(x=week_num, y=weekwise_deaths,
                    mode='lines+markers',
                    name='Crecimiento semanal de los casos de muerte'))
fig.add_trace(go.Scatter(x=week_num, y=weekwise_active,
                    mode='lines+markers',
                    name='Crecimiento semanal de los casos Activos'))
fig.update_layout(title="Crecimiento semanal de diferentes tipos de casos en Cartagena",
                 xaxis_title="Número de semanas",yaxis_title="Número de casos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [327]:
fig, (ax1,ax2) = plt.subplots(1, 2,figsize=(15,5))
sns.barplot(x=week_num,y=pd.Series(weekwise_confirmed).diff().fillna(0),ax=ax1)
sns.barplot(x=week_num,y=pd.Series(weekwise_deaths).diff().fillna(0),ax=ax2)
ax1.set_xlabel("Número de semanas")
ax2.set_xlabel("Número de semanas")
ax1.set_ylabel("Número de casos confirmados")
ax2.set_ylabel("Número de casos de fallecidos")
ax1.set_title("Aumento semanal del número de casos confirmados en Cartagena")
ax2.set_title("Aumento semanal del número de casos de muerte en Cartagena")
Out[327]:
Text(0.5, 1.0, 'Aumento semanal del número de casos de muerte en Cartagena')

Tasa de crecimiento de los casos confirmados, recuperados y de muerte

In [328]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_confirmados"],
                    mode='lines+markers',
                    name='Casos confirmados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Recuperados"],
                    mode='lines+markers',
                    name='Casos Recuperados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_muertos"],
                    mode='lines+markers',
                    name='Casos de muertes'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Activos"],
                    mode='lines+markers',
                    name='Casos Activos'))
fig.update_layout(title="Crecimiento de los diferentes tipos de casos en Cartagena",
                 xaxis_title="Fecha",yaxis_title="Número de casos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()

Análisis de la tasa de moralidad y recuperación

In [329]:
df_Nuevo["Tasa de mortalidad"]=(df_Nuevo["Acum_muertos"]/df_Nuevo["Acum_confirmados"])*100
df_Nuevo["Tasa de Recuperacion"]=(df_Nuevo["Acum_Recuperados"]/df_Nuevo["Acum_confirmados"])*100
df_Nuevo["Casos Cerrados"]=df_Nuevo["Acum_Recuperados"]+df_Nuevo["Acum_muertos"]

print("Tasa de mortalidad media",df_Nuevo["Tasa de mortalidad"].mean())
print("Tasa de mortalidad media",df_Nuevo["Tasa de mortalidad"].median())
print("Promedio de la tasa de recuperación",df_Nuevo["Tasa de Recuperacion"].mean())
print("Tasa de recuperación media",df_Nuevo["Tasa de Recuperacion"].median())

#Plotting Mortality and Recovery Rate 
fig = make_subplots(rows=2, cols=1,
                   subplot_titles=("Tasa de Recuperacion", "Tasa de mortalidad"))
fig.add_trace(
    go.Scatter(x=df_Nuevo.index, y=(df_Nuevo["Acum_Recuperados"]/df_Nuevo["Acum_confirmados"])*100,name="Tasa de Recuperacion"),
    row=1, col=1
)
fig.add_trace(
    go.Scatter(x=df_Nuevo.index, y=(df_Nuevo["Acum_muertos"]/df_Nuevo["Acum_confirmados"])*100,name="Tasa de mortalidad"),
    row=2, col=1
)
fig.update_layout(height=1000,legend=dict(x=-0.1,y=1.2,traceorder="normal"))
fig.update_xaxes(title_text="Fecha", row=1, col=1)
fig.update_yaxes(title_text="Tasa de Recuperacion en Cartagena", row=1, col=1)
fig.update_xaxes(title_text="Fecha", row=1, col=2)
fig.update_yaxes(title_text="Tasa de mortalidad en Cartagena", row=1, col=2)
fig.show()
Tasa de mortalidad media 3.9970479393075933
Tasa de mortalidad media 3.65911799761621
Promedio de la tasa de recuperación 36.55064141062333
Tasa de recuperación media 28.647996784135067
In [330]:
print("Aumento medio del número de casos confirmados cada día en Cartagena: ",np.round(df_Nuevo["Acum_confirmados"].diff().fillna(0).mean()))
print("Aumento medio del número de casos recuperados cada día en Cartagena: ",np.round(df_Nuevo["Acum_Recuperados"].diff().fillna(0).mean()))
print("Aumento promedio del número de casos de muerte cada día en Cartagena: ",np.round(df_Nuevo["Acum_muertos"].diff().fillna(0).mean()))
print("Aumento promedio del número de casos de activos cada día en Cartagena: ",np.round(df_Nuevo["Acum_Activos"].diff().fillna(0).mean()))

fig=go.Figure()
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_confirmados"].diff().fillna(0),mode='lines+markers',
                    name='Casos de confirmados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Recuperados"].diff().fillna(0),mode='lines+markers',
                    name='Casos de recuperados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_muertos"].diff().fillna(0),mode='lines+markers',
                    name='Casos de Muerte'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Activos"].diff().fillna(0),mode='lines+markers',
                    name='Casos Activos'))
fig.update_layout(title="Aumento diario de los diferentes tipos de casos en Cartagena",
                 xaxis_title="Fecha",yaxis_title="Número de casos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
Aumento medio del número de casos confirmados cada día en Cartagena:  111.0
Aumento medio del número de casos recuperados cada día en Cartagena:  101.0
Aumento promedio del número de casos de muerte cada día en Cartagena:  3.0
Aumento promedio del número de casos de activos cada día en Cartagena:  7.0
In [331]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_confirmados"].diff().rolling(window=7).mean(),mode='lines+markers',
                    name='Casos Confirmados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Recuperados"].diff().rolling(window=7).mean(),mode='lines+markers',
                    name='Casos Recuperados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_muertos"].diff().rolling(window=7).mean(),mode='lines+markers',
                    name='Casos Fallecidos'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Activos"].diff().rolling(window=7).mean(),mode='lines+markers',
                    name='Casos Activos'))
fig.update_layout(title="Media móvil por cada 7 días de los casos confirmados, recuperados y de muerte en Cartagena",
                 xaxis_title="Fecha",yaxis_title="Número de casos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [332]:
print("Promedio de crecimiento medio del número de casos confirmados en Cartagena: ",(df_Nuevo["Acum_confirmados"]/df_Nuevo["Acum_confirmados"].shift()).mean())
print("Mediana de crecimiento medio del número de casos confirmados en Cartagena: ",(df_Nuevo["Acum_confirmados"]/df_Nuevo["Acum_confirmados"].shift()).median())
print("Promedio de crecimiento medio del número de casos recuperados en Cartagena: ",(df_Nuevo["Acum_Recuperados"]/df_Nuevo["Acum_Recuperados"].shift()).mean())
print("Mediana de crecimiento medio del número de casos recuperados en Cartagena: ",(df_Nuevo["Acum_Recuperados"]/df_Nuevo["Acum_Recuperados"].shift()).median())
print("Promedio de crecimiento medio del número de casos de muerte en Cartagena: ",(df_Nuevo["Acum_muertos"]/df_Nuevo["Acum_muertos"].shift()).mean())
print("Mediana de crecimiento medio del número de casos de muerte en Cartagena: ",(df_Nuevo["Acum_muertos"]/df_Nuevo["Acum_muertos"].shift()).median())

fig=go.Figure()
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_confirmados"]/df_Nuevo["Acum_confirmados"].shift(),
                    mode='lines',
                    name='Factor de crecimiento de los casos confirmados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Recuperados"]/df_Nuevo["Acum_Recuperados"].shift(),
                    mode='lines',
                    name='Factor de crecimiento de los casos recuperados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_muertos"]/df_Nuevo["Acum_muertos"].shift(),
                    mode='lines',
                    name='Factor de crecimiento de los casos de muerte'))
fig.update_layout(title="Factor de crecimiento en función de la fecha de los diferentes tipos de casos en Cartagena",
                 xaxis_title="Fecha",yaxis_title="Factor de crecimiento",
                 legend=dict(x=0,y=-0.4,traceorder="normal"))
fig.show()
Promedio de crecimiento medio del número de casos confirmados en Cartagena:  inf
Mediana de crecimiento medio del número de casos confirmados en Cartagena:  1.0299756690997568
Promedio de crecimiento medio del número de casos recuperados en Cartagena:  inf
Mediana de crecimiento medio del número de casos recuperados en Cartagena:  1.0336569339459514
Promedio de crecimiento medio del número de casos de muerte en Cartagena:  inf
Mediana de crecimiento medio del número de casos de muerte en Cartagena:  1.0118577075098814

MODELOS DE PREDICCIÓN CARTAGENA

CASOS CONFIRMADOS

Modelo ARIMA (Usando Auto-ARIMA)

In [333]:
model_train=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
y_pred=valid.copy()
In [334]:
model_arima= auto_arima(model_train["Acum_confirmados"],trace=True, error_action='ignore', start_p=1,start_q=1,max_p=3,max_q=3,
                   suppress_warnings=True,stepwise=False,seasonal=False)
model_arima.fit(model_train["Acum_confirmados"])
 ARIMA(0,2,0)(0,0,0)[0] intercept   : AIC=1965.301, Time=0.02 sec
 ARIMA(0,2,1)(0,0,0)[0] intercept   : AIC=1928.354, Time=0.13 sec
 ARIMA(0,2,2)(0,0,0)[0] intercept   : AIC=1919.689, Time=0.22 sec
 ARIMA(0,2,3)(0,0,0)[0] intercept   : AIC=1917.347, Time=0.26 sec
 ARIMA(1,2,0)(0,0,0)[0] intercept   : AIC=1953.001, Time=0.13 sec
 ARIMA(1,2,1)(0,0,0)[0] intercept   : AIC=1922.273, Time=0.23 sec
 ARIMA(1,2,2)(0,0,0)[0] intercept   : AIC=1912.040, Time=0.45 sec
 ARIMA(1,2,3)(0,0,0)[0] intercept   : AIC=1913.875, Time=0.49 sec
 ARIMA(2,2,0)(0,0,0)[0] intercept   : AIC=1938.984, Time=0.19 sec
 ARIMA(2,2,1)(0,0,0)[0] intercept   : AIC=1921.335, Time=0.29 sec
 ARIMA(2,2,2)(0,0,0)[0] intercept   : AIC=1913.849, Time=0.44 sec
 ARIMA(2,2,3)(0,0,0)[0] intercept   : AIC=1912.545, Time=0.45 sec
 ARIMA(3,2,0)(0,0,0)[0] intercept   : AIC=1939.498, Time=0.22 sec
 ARIMA(3,2,1)(0,0,0)[0] intercept   : AIC=1923.051, Time=0.42 sec
 ARIMA(3,2,2)(0,0,0)[0] intercept   : AIC=1915.784, Time=0.49 sec
Total fit time: 4.447 seconds
Out[334]:
ARIMA(order=(1, 2, 2), scoring_args={}, suppress_warnings=True)
In [335]:
prediction_arima=model_arima.predict(len(valid))
y_pred["ARIMA Model Prediction"]=prediction_arima
In [336]:
model_scores.append(np.sqrt(mean_squared_error(valid["Acum_confirmados"],prediction_arima)))
print("Error Cuadrático Medio Modelo ARIMA: ",np.sqrt(mean_squared_error(valid["Acum_confirmados"],prediction_arima)))
Error Cuadrático Medio Modelo ARIMA:  212.0106813280978
In [337]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=model_train.index, y=model_train["Acum_confirmados"],
                    mode='lines+markers',name="Datos de entrenamiento para casos confirmados"))
fig.add_trace(go.Scatter(x=valid.index, y=valid["Acum_confirmados"],
                    mode='lines+markers',name="Datos de validación para datos confirmados",))
fig.add_trace(go.Scatter(x=valid.index, y=y_pred["ARIMA Model Prediction"],
                    mode='lines+markers',name="Predicción de casos confirmados",))
fig.update_layout(title="Predicción de casos confirmados con el modelo ARIMA de Cartagena",
                 xaxis_title="Fecha",yaxis_title="Acum_confirmados",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [338]:
ARIMA_model_new_prediction=[]
for i in range(1,18):
    ARIMA_model_new_prediction.append(model_arima.predict(len(valid)+i)[-1])
pd.DataFrame(zip(new_date,ARIMA_model_new_prediction),columns=["Confirmados","Predicción Modelo ARIMA"]).head()
Out[338]:
Confirmados Predicción Modelo ARIMA
0 2020-09-05 21190.035107
1 2020-09-06 21253.976818
2 2020-09-07 21318.133939
3 2020-09-08 21382.710151
4 2020-09-09 21447.591568

Modelo Prophet

In [339]:
prophet_c=Prophet(interval_width=0.75,weekly_seasonality=True,)
prophet_confirmed=pd.DataFrame(zip(list(df_Nuevo.index),list(df_Nuevo["Acum_confirmados"])),columns=['ds','y'])
In [340]:
prophet_c.fit(prophet_confirmed)
INFO:fbprophet:Disabling yearly seasonality. Run prophet with yearly_seasonality=True to override this.
INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.
Out[340]:
<fbprophet.forecaster.Prophet at 0x1c22ec01208>
In [341]:
forecast_c=prophet_c.make_future_dataframe(periods=17)
forecast_confirmed=forecast_c.copy()
In [342]:
confirmed_forecast=prophet_c.predict(forecast_c)
In [343]:
model_scores.append(np.sqrt(mean_squared_error(df_Nuevo["Acum_confirmados"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
print("Error Cuadrático Medio Modelo Prophet: ",np.sqrt(mean_squared_error(df_Nuevo["Acum_confirmados"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
Error Cuadrático Medio Modelo Prophet:  127.21115817404623
In [344]:
print(prophet_c.plot(confirmed_forecast))
Figure(720x432)
In [345]:
print(prophet_c.plot_components(confirmed_forecast))
Figure(648x432)

CASOS FALLECIDOS

Modelo ARIMA (Usando Auto-ARIMA)

In [346]:
model_train=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
y_pred=valid.copy()
In [347]:
model_arima= auto_arima(model_train["Acum_muertos"],trace=True, error_action='ignore', start_p=1,start_q=1,max_p=3,max_q=3,
                   suppress_warnings=True,stepwise=False,seasonal=False)
model_arima.fit(model_train["Acum_muertos"])
 ARIMA(0,2,0)(0,0,0)[0] intercept   : AIC=850.873, Time=0.02 sec
 ARIMA(0,2,1)(0,0,0)[0] intercept   : AIC=746.924, Time=0.12 sec
 ARIMA(0,2,2)(0,0,0)[0] intercept   : AIC=743.185, Time=0.21 sec
 ARIMA(0,2,3)(0,0,0)[0] intercept   : AIC=739.705, Time=0.17 sec
 ARIMA(1,2,0)(0,0,0)[0] intercept   : AIC=804.061, Time=0.07 sec
 ARIMA(1,2,1)(0,0,0)[0] intercept   : AIC=745.665, Time=0.16 sec
 ARIMA(1,2,2)(0,0,0)[0] intercept   : AIC=742.092, Time=0.30 sec
 ARIMA(1,2,3)(0,0,0)[0] intercept   : AIC=740.119, Time=0.25 sec
 ARIMA(2,2,0)(0,0,0)[0] intercept   : AIC=751.161, Time=0.10 sec
 ARIMA(2,2,1)(0,0,0)[0] intercept   : AIC=737.533, Time=0.17 sec
 ARIMA(2,2,2)(0,0,0)[0] intercept   : AIC=738.774, Time=0.25 sec
 ARIMA(2,2,3)(0,0,0)[0] intercept   : AIC=740.000, Time=0.62 sec
 ARIMA(3,2,0)(0,0,0)[0] intercept   : AIC=745.234, Time=0.14 sec
 ARIMA(3,2,1)(0,0,0)[0] intercept   : AIC=738.829, Time=0.21 sec
 ARIMA(3,2,2)(0,0,0)[0] intercept   : AIC=740.742, Time=0.45 sec
Total fit time: 3.265 seconds
Out[347]:
ARIMA(order=(2, 2, 1), scoring_args={}, suppress_warnings=True)
In [348]:
prediction_arima=model_arima.predict(len(valid))
y_pred["ARIMA Model Prediction"]=prediction_arima
In [349]:
model_scores.append(np.sqrt(mean_squared_error(valid["Acum_muertos"],prediction_arima)))
print("Error Cuadrático Medio Modelo ARIMA: ",np.sqrt(mean_squared_error(valid["Acum_muertos"],prediction_arima)))
Error Cuadrático Medio Modelo ARIMA:  1.5883307300850902
In [350]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=model_train.index, y=model_train["Acum_muertos"],
                    mode='lines+markers',name="Datos de entrenamiento para casos fallecidos"))
fig.add_trace(go.Scatter(x=valid.index, y=valid["Acum_muertos"],
                    mode='lines+markers',name="Datos de validación para datos fallecidos",))
fig.add_trace(go.Scatter(x=valid.index, y=y_pred["ARIMA Model Prediction"],
                    mode='lines+markers',name="Predicción de casos fallecidos",))
fig.update_layout(title="Predicción de casos fallecidos con el modelo ARIMA de Cartagena",
                 xaxis_title="Fecha",yaxis_title="Acum_muertos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [351]:
ARIMA_model_new_prediction=[]
for i in range(1,18):
    ARIMA_model_new_prediction.append(model_arima.predict(len(valid)+i)[-1])
pd.DataFrame(zip(new_date,ARIMA_model_new_prediction),columns=["Fallecidos","Predicción Modelo ARIMA"]).head()
Out[351]:
Fallecidos Predicción Modelo ARIMA
0 2020-09-05 527.025435
1 2020-09-06 527.798887
2 2020-09-07 528.578696
3 2020-09-08 529.362736
4 2020-09-09 530.150293

Modelo Prophet

In [352]:
prophet_c=Prophet(interval_width=0.75,weekly_seasonality=True,)
prophet_confirmed=pd.DataFrame(zip(list(df_Nuevo.index),list(df_Nuevo["Acum_muertos"])),columns=['ds','y'])
In [353]:
prophet_c.fit(prophet_confirmed)
INFO:fbprophet:Disabling yearly seasonality. Run prophet with yearly_seasonality=True to override this.
INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.
Out[353]:
<fbprophet.forecaster.Prophet at 0x1c22c3d5d48>
In [354]:
forecast_c=prophet_c.make_future_dataframe(periods=17)
forecast_confirmed=forecast_c.copy()
In [355]:
confirmed_forecast=prophet_c.predict(forecast_c)
In [356]:
model_scores.append(np.sqrt(mean_squared_error(df_Nuevo["Acum_muertos"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
print("Error Cuadrático Medio Modelo Prophet: ",np.sqrt(mean_squared_error(df_Nuevo["Acum_muertos"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
Error Cuadrático Medio Modelo Prophet:  1.7267223196691661
In [357]:
print(prophet_c.plot(confirmed_forecast))
Figure(720x432)
In [358]:
print(prophet_c.plot_components(confirmed_forecast))
Figure(648x432)

CASOS RECUPERADOS

Modelo ARIMA (Usando Auto-ARIMA)

In [359]:
model_train=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
y_pred=valid.copy()
In [360]:
model_arima= auto_arima(model_train["Acum_Recuperados"],trace=True, error_action='ignore', start_p=1,start_q=1,max_p=3,max_q=3,
                   suppress_warnings=True,stepwise=False,seasonal=False)
model_arima.fit(model_train["Acum_Recuperados"])
 ARIMA(0,2,0)(0,0,0)[0] intercept   : AIC=1991.619, Time=0.02 sec
 ARIMA(0,2,1)(0,0,0)[0] intercept   : AIC=1908.164, Time=0.12 sec
 ARIMA(0,2,2)(0,0,0)[0] intercept   : AIC=1910.138, Time=0.21 sec
 ARIMA(0,2,3)(0,0,0)[0] intercept   : AIC=1911.412, Time=0.30 sec
 ARIMA(1,2,0)(0,0,0)[0] intercept   : AIC=1938.622, Time=0.12 sec
 ARIMA(1,2,1)(0,0,0)[0] intercept   : AIC=1910.133, Time=0.21 sec
 ARIMA(1,2,2)(0,0,0)[0] intercept   : AIC=1911.592, Time=0.46 sec
 ARIMA(1,2,3)(0,0,0)[0] intercept   : AIC=1913.296, Time=0.63 sec
 ARIMA(2,2,0)(0,0,0)[0] intercept   : AIC=1927.069, Time=0.16 sec
 ARIMA(2,2,1)(0,0,0)[0] intercept   : AIC=1911.306, Time=0.35 sec
 ARIMA(2,2,2)(0,0,0)[0] intercept   : AIC=1913.266, Time=0.65 sec
 ARIMA(2,2,3)(0,0,0)[0] intercept   : AIC=1908.761, Time=0.73 sec
 ARIMA(3,2,0)(0,0,0)[0] intercept   : AIC=1920.337, Time=0.16 sec
 ARIMA(3,2,1)(0,0,0)[0] intercept   : AIC=1913.291, Time=0.45 sec
 ARIMA(3,2,2)(0,0,0)[0] intercept   : AIC=1914.829, Time=0.71 sec
Total fit time: 5.297 seconds
Out[360]:
ARIMA(order=(0, 2, 1), scoring_args={}, suppress_warnings=True)
In [361]:
prediction_arima=model_arima.predict(len(valid))
y_pred["ARIMA Model Prediction"]=prediction_arima
In [362]:
model_scores.append(np.sqrt(mean_squared_error(valid["Acum_Recuperados"],prediction_arima)))
print("Error Cuadrático Medio Modelo ARIMA: ",np.sqrt(mean_squared_error(valid["Acum_Recuperados"],prediction_arima)))
Error Cuadrático Medio Modelo ARIMA:  751.4728643400532
In [363]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=model_train.index, y=model_train["Acum_Recuperados"],
                    mode='lines+markers',name="Datos de entrenamiento para casos recuperados"))
fig.add_trace(go.Scatter(x=valid.index, y=valid["Acum_Recuperados"],
                    mode='lines+markers',name="Datos de validación para datos recuperados",))
fig.add_trace(go.Scatter(x=valid.index, y=y_pred["ARIMA Model Prediction"],
                    mode='lines+markers',name="Predicción de casos recuperados",))
fig.update_layout(title="Predicción de casos recuperados con el modelo ARIMA de Cartagena",
                 xaxis_title="Fecha",yaxis_title="Acum_Recuperados",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [364]:
ARIMA_model_new_prediction=[]
for i in range(1,18):
    ARIMA_model_new_prediction.append(model_arima.predict(len(valid)+i)[-1])
pd.DataFrame(zip(new_date,ARIMA_model_new_prediction),columns=["Recuperados","Predicción Modelo ARIMA"]).head()
Out[364]:
Recuperados Predicción Modelo ARIMA
0 2020-09-05 20363.331646
1 2020-09-06 20633.054730
2 2020-09-07 20904.248395
3 2020-09-08 21176.912640
4 2020-09-09 21451.047465

Modelo Prophet

In [365]:
prophet_c=Prophet(interval_width=0.75,weekly_seasonality=True,)
prophet_confirmed=pd.DataFrame(zip(list(df_Nuevo.index),list(df_Nuevo["Acum_Recuperados"])),columns=['ds','y'])
In [366]:
prophet_c.fit(prophet_confirmed)
INFO:fbprophet:Disabling yearly seasonality. Run prophet with yearly_seasonality=True to override this.
INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.
Out[366]:
<fbprophet.forecaster.Prophet at 0x1c22c23bec8>
In [367]:
forecast_c=prophet_c.make_future_dataframe(periods=17)
forecast_confirmed=forecast_c.copy()
In [368]:
confirmed_forecast=prophet_c.predict(forecast_c)
In [369]:
model_scores.append(np.sqrt(mean_squared_error(df_Nuevo["Acum_Recuperados"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
print("Error Cuadrático Medio Modelo Prophet: ",np.sqrt(mean_squared_error(df_Nuevo["Acum_Recuperados"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
Error Cuadrático Medio Modelo Prophet:  98.55069937999586
In [370]:
print(prophet_c.plot(confirmed_forecast))
Figure(720x432)
In [371]:
print(prophet_c.plot_components(confirmed_forecast))
Figure(648x432)

CASOS ACTIVOS

Modelo ARIMA (Usando Auto-ARIMA)

In [372]:
model_train=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
y_pred=valid.copy()
In [373]:
model_arima= auto_arima(model_train["Acum_Activos"],trace=True, error_action='ignore', start_p=1,start_q=1,max_p=3,max_q=3,
                   suppress_warnings=True,stepwise=False,seasonal=False)
model_arima.fit(model_train["Acum_Activos"])
 ARIMA(0,2,0)(0,0,0)[0] intercept   : AIC=2087.122, Time=0.03 sec
 ARIMA(0,2,1)(0,0,0)[0] intercept   : AIC=2023.435, Time=0.15 sec
 ARIMA(0,2,2)(0,0,0)[0] intercept   : AIC=2023.491, Time=0.25 sec
 ARIMA(0,2,3)(0,0,0)[0] intercept   : AIC=2025.054, Time=0.32 sec
 ARIMA(1,2,0)(0,0,0)[0] intercept   : AIC=2059.193, Time=0.11 sec
 ARIMA(1,2,1)(0,0,0)[0] intercept   : AIC=2023.752, Time=0.25 sec
 ARIMA(1,2,2)(0,0,0)[0] intercept   : AIC=2025.173, Time=0.44 sec
 ARIMA(1,2,3)(0,0,0)[0] intercept   : AIC=2025.556, Time=0.63 sec
 ARIMA(2,2,0)(0,0,0)[0] intercept   : AIC=2042.373, Time=0.15 sec
 ARIMA(2,2,1)(0,0,0)[0] intercept   : AIC=2025.103, Time=0.37 sec
 ARIMA(2,2,2)(0,0,0)[0] intercept   : AIC=2024.925, Time=0.78 sec
 ARIMA(2,2,3)(0,0,0)[0] intercept   : AIC=2024.214, Time=0.90 sec
 ARIMA(3,2,0)(0,0,0)[0] intercept   : AIC=2039.196, Time=0.24 sec
 ARIMA(3,2,1)(0,0,0)[0] intercept   : AIC=2027.103, Time=0.52 sec
 ARIMA(3,2,2)(0,0,0)[0] intercept   : AIC=2026.632, Time=0.73 sec
Total fit time: 5.882 seconds
Out[373]:
ARIMA(order=(0, 2, 1), scoring_args={}, suppress_warnings=True)
In [374]:
prediction_arima=model_arima.predict(len(valid))
y_pred["ARIMA Model Prediction"]=prediction_arima
In [375]:
model_scores.append(np.sqrt(mean_squared_error(valid["Acum_Activos"],prediction_arima)))
print("Error Cuadrático Medio Modelo ARIMA: ",np.sqrt(mean_squared_error(valid["Acum_Activos"],prediction_arima)))
Error Cuadrático Medio Modelo ARIMA:  523.884865638275
In [376]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=model_train.index, y=model_train["Acum_Activos"],
                    mode='lines+markers',name="Datos de entrenamiento para casos activos"))
fig.add_trace(go.Scatter(x=valid.index, y=valid["Acum_Activos"],
                    mode='lines+markers',name="Datos de validación para datos activos",))
fig.add_trace(go.Scatter(x=valid.index, y=y_pred["ARIMA Model Prediction"],
                    mode='lines+markers',name="Predicción de casos activos",))
fig.update_layout(title="Predicción de casos activos con el modelo ARIMA de Cartagena",
                 xaxis_title="Fecha",yaxis_title="Acum_muertos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [377]:
ARIMA_model_new_prediction=[]
for i in range(1,18):
    ARIMA_model_new_prediction.append(model_arima.predict(len(valid)+i)[-1])
pd.DataFrame(zip(new_date,ARIMA_model_new_prediction),columns=["Activos","Predicción Modelo ARIMA"]).head()
Out[377]:
Activos Predicción Modelo ARIMA
0 2020-09-05 324.864415
1 2020-09-06 119.940678
2 2020-09-07 -86.098128
3 2020-09-08 -293.252001
4 2020-09-09 -501.520942

Modelo Prophet

In [378]:
prophet_c=Prophet(interval_width=0.75,weekly_seasonality=True,)
prophet_confirmed=pd.DataFrame(zip(list(df_Nuevo.index),list(df_Nuevo["Acum_Activos"])),columns=['ds','y'])
In [379]:
prophet_c.fit(prophet_confirmed)
INFO:fbprophet:Disabling yearly seasonality. Run prophet with yearly_seasonality=True to override this.
INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.
Out[379]:
<fbprophet.forecaster.Prophet at 0x1c22f98f448>
In [380]:
forecast_c=prophet_c.make_future_dataframe(periods=17)
forecast_confirmed=forecast_c.copy()
In [381]:
confirmed_forecast=prophet_c.predict(forecast_c)
In [382]:
model_scores.append(np.sqrt(mean_squared_error(df_Nuevo["Acum_Activos"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
print("Error Cuadrático Medio Modelo Prophet: ",np.sqrt(mean_squared_error(df_Nuevo["Acum_Activos"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
Error Cuadrático Medio Modelo Prophet:  121.97866423088327
In [383]:
print(prophet_c.plot(confirmed_forecast))
Figure(720x432)
In [384]:
print(prophet_c.plot_components(confirmed_forecast))
Figure(648x432)